#!/bin/bash
# Linux笔记本关盖休眠设置脚本
# 适用于支持systemd的Linux系统
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 配置文件路径
LOGIND_CONF="/etc/systemd/logind.conf"
LOGIND_CONF_DIR="/etc/systemd/logind.conf.d/"
CUSTOM_CONF="$LOGIND_CONF_DIR/lid-settings.conf"
# 系统信息
DISTRO=$(lsb_release -si 2>/dev/null || echo "Unknown")
DISTRO_VERSION=$(lsb_release -sr 2>/dev/null || echo "Unknown")
KERNEL=$(uname -r)
# 检查是否以root运行
check_root() {
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}错误:此脚本需要root权限${NC}"
echo "请使用 sudo 运行:sudo $0"
exit 1
fi
}
# 显示系统信息
show_system_info() {
echo -e "${CYAN}系统信息:${NC}"
echo -e "发行版: $DISTRO $DISTRO_VERSION"
echo -e "内核版本: $KERNEL"
echo -e "主机名: $(hostname)"
# 检查是否为笔记本电脑
if [ -d /sys/class/power_supply/ ]; then
echo -e "设备类型: 笔记本电脑"
else
echo -e "${YELLOW}设备类型: 可能不是笔记本电脑${NC}"
fi
}
# 显示当前设置
show_current_settings() {
echo -e "\n${BLUE}=== 当前关盖设置 ===${NC}"
# 检查是否有盖子设备
if [ -e /proc/acpi/button/lid/LID/state ]; then
lid_state=$(cat /proc/acpi/button/lid/LID/state 2>/dev/null | awk '{print $2}')
echo -e "${CYAN}盖子状态:${NC} $lid_state"
elif [ -d /sys/class/power_supply/ ]; then
echo -e "${CYAN}盖子状态:${NC} 通过/sys接口检测"
fi
# 检查全局配置
if [ -f "$LOGIND_CONF" ]; then
echo -e "\n${YELLOW}全局配置 ($LOGIND_CONF):${NC}"
grep -E "^(#)?HandleLidSwitch" "$LOGIND_CONF" || echo "未设置(使用默认值)"
grep -E "^(#)?HandleLidSwitchExternalPower" "$LOGIND_CONF" || echo ""
grep -E "^(#)?HandleLidSwitchDocked" "$LOGIND_CONF" || echo ""
fi
# 检查自定义配置
if [ -f "$CUSTOM_CONF" ]; then
echo -e "\n${YELLOW}自定义配置 ($CUSTOM_CONF):${NC}"
cat "$CUSTOM_CONF"
fi
# 显示实际生效的值
echo -e "\n${YELLOW}实际生效的设置:${NC}"
current_setting=$(systemctl cat systemd-logind 2>/dev/null | grep -i HandleLidSwitch | tail -1)
if [ -n "$current_setting" ]; then
echo "$current_setting"
else
echo "使用默认设置: HandleLidSwitch=suspend"
fi
# 检查其他可能的配置文件
if [ -f "/etc/UPower/UPower.conf" ]; then
echo -e "\n${YELLOW}UPower 配置:${NC}"
grep -i "IgnoreLid" /etc/UPower/UPower.conf || echo "未设置"
fi
}
# 启用关盖休眠
enable_lid_suspend() {
echo -e "\n${GREEN}正在启用关盖休眠...${NC}"
# 创建配置目录(如果不存在)
mkdir -p "$LOGIND_CONF_DIR"
# 创建或更新自定义配置
cat > "$CUSTOM_CONF" << EOF
# 笔记本盖子关闭行为设置
# 文件生成时间: $(date)
# 系统: $DISTRO $DISTRO_VERSION
#
# 选项说明:
# suspend - 关盖时挂起/休眠
# lock - 关盖时锁定屏幕
# ignore - 关盖时不执行任何操作
# poweroff - 关盖时关机
# hibernate - 关盖时深度休眠
# hybrid-sleep - 混合休眠
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=ignore
EOF
echo -e "${GREEN}配置已保存到 $CUSTOM_CONF${NC}"
# 重新加载systemd配置
systemctl daemon-reload
systemctl restart systemd-logind
echo -e "${GREEN}服务已重启,设置生效${NC}"
# 对于某些桌面环境,可能需要额外的设置
if [ -f "/etc/UPower/UPower.conf" ]; then
echo -e "${YELLOW}检测到UPower,建议同时配置UPower设置${NC}"
echo "可以在桌面环境的电源管理设置中进行配置"
fi
}
# 禁用关盖休眠
disable_lid_suspend() {
echo -e "\n${YELLOW}正在禁用关盖休眠(关盖时不执行操作)...${NC}"
# 创建配置目录(如果不存在)
mkdir -p "$LOGIND_CONF_DIR"
# 创建或更新自定义配置
cat > "$CUSTOM_CONF" << EOF
# 笔记本盖子关闭行为设置
# 文件生成时间: $(date)
# 系统: $DISTRO $DISTRO_VERSION
#
# 选项说明:
# suspend - 关盖时挂起/休眠
# lock - 关盖时锁定屏幕
# ignore - 关盖时不执行任何操作
# poweroff - 关盖时关机
# hibernate - 关盖时深度休眠
# hybrid-sleep - 混合休眠
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
EOF
echo -e "${GREEN}配置已保存到 $CUSTOM_CONF${NC}"
# 重新加载systemd配置
systemctl daemon-reload
systemctl restart systemd-logind
echo -e "${GREEN}服务已重启,设置生效${NC}"
echo -e "\n${CYAN}注意:${NC}"
echo "禁用关盖休眠后,合上盖子时屏幕可能会继续亮着,消耗电量。"
echo "如果需要关闭屏幕但不休眠,请选择'只锁定屏幕'选项。"
}
# 设置自定义行为
set_custom_behavior() {
echo -e "\n${BLUE}=== 设置自定义关盖行为 ===${NC}"
echo "请选择关盖时的行为:"
echo -e "1) ${GREEN}suspend${NC} - 挂起/休眠(默认,低功耗状态)"
echo -e "2) ${GREEN}lock${NC} - 只锁定屏幕(保持运行)"
echo -e "3) ${YELLOW}ignore${NC} - 不执行任何操作"
echo -e "4) ${RED}poweroff${NC} - 关机"
echo -e "5) ${PURPLE}hibernate${NC} - 深度休眠(保存到硬盘)"
echo -e "6) ${CYAN}hybrid-sleep${NC} - 混合休眠"
read -p "请输入选项编号 (1-6): " choice
case $choice in
1) behavior="suspend" ;;
2) behavior="lock" ;;
3) behavior="ignore" ;;
4) behavior="poweroff" ;;
5) behavior="hibernate" ;;
6) behavior="hybrid-sleep" ;;
*)
echo -e "${RED}无效选择,使用默认值 (suspend)${NC}"
behavior="suspend"
;;
esac
echo -e "\n${CYAN}是否区分电源状态?${NC}"
echo "1) 统一设置(电池和电源都使用相同行为)"
echo "2) 分别设置(电池和电源使用不同行为)"
read -p "请选择 (1-2): " power_choice
# 创建配置目录(如果不存在)
mkdir -p "$LOGIND_CONF_DIR"
if [ "$power_choice" = "2" ]; then
echo -e "\n${CYAN}请设置使用电池时的行为:${NC}"
echo "1) suspend 2) lock 3) ignore"
echo "4) poweroff 5) hibernate 6) hybrid-sleep"
read -p "选项 (1-6): " battery_choice
case $battery_choice in
1) battery_behavior="suspend" ;;
2) battery_behavior="lock" ;;
3) battery_behavior="ignore" ;;
4) battery_behavior="poweroff" ;;
5) battery_behavior="hibernate" ;;
6) battery_behavior="hybrid-sleep" ;;
*) battery_behavior="$behavior" ;;
esac
echo -e "\n${CYAN}请设置使用外接电源时的行为:${NC}"
echo "1) suspend 2) lock 3) ignore"
echo "4) poweroff 5) hibernate 6) hybrid-sleep"
read -p "选项 (1-6): " ac_choice
case $ac_choice in
1) ac_behavior="suspend" ;;
2) ac_behavior="lock" ;;
3) ac_behavior="ignore" ;;
4) ac_behavior="poweroff" ;;
5) ac_behavior="hibernate" ;;
6) ac_behavior="hybrid-sleep" ;;
*) ac_behavior="$behavior" ;;
esac
# 创建或更新自定义配置
cat > "$CUSTOM_CONF" << EOF
# 笔记本盖子关闭行为设置
# 文件生成时间: $(date)
# 系统: $DISTRO $DISTRO_VERSION
#
# 选项说明:
# suspend - 关盖时挂起/休眠
# lock - 关盖时锁定屏幕
# ignore - 关盖时不执行任何操作
# poweroff - 关盖时关机
# hibernate - 关盖时深度休眠
# hybrid-sleep - 混合休眠
HandleLidSwitch=$battery_behavior
HandleLidSwitchExternalPower=$ac_behavior
HandleLidSwitchDocked=ignore
EOF
echo -e "\n${GREEN}已设置:${NC}"
echo -e "使用电池时: ${GREEN}$battery_behavior${NC}"
echo -e "使用外接电源时: ${GREEN}$ac_behavior${NC}"
else
# 创建或更新自定义配置
cat > "$CUSTOM_CONF" << EOF
# 笔记本盖子关闭行为设置
# 文件生成时间: $(date)
# 系统: $DISTRO $DISTRO_VERSION
#
# 选项说明:
# suspend - 关盖时挂起/休眠
# lock - 关盖时锁定屏幕
# ignore - 关盖时不执行任何操作
# poweroff - 关盖时关机
# hibernate - 关盖时深度休眠
# hybrid-sleep - 混合休眠
HandleLidSwitch=$behavior
HandleLidSwitchExternalPower=$behavior
HandleLidSwitchDocked=ignore
EOF
echo -e "${GREEN}已设置关盖行为为: $behavior${NC}"
fi
echo -e "${GREEN}配置已保存到 $CUSTOM_CONF${NC}"
# 重新加载systemd配置
systemctl daemon-reload
systemctl restart systemd-logind
echo -e "${GREEN}服务已重启,设置生效${NC}"
}
# 恢复默认设置
restore_default() {
echo -e "\n${YELLOW}正在恢复默认设置...${NC}"
# 删除自定义配置
if [ -f "$CUSTOM_CONF" ]; then
rm "$CUSTOM_CONF"
echo -e "${GREEN}已删除自定义配置${NC}"
else
echo -e "${YELLOW}未找到自定义配置${NC}"
fi
# 重新加载systemd配置
systemctl daemon-reload
systemctl restart systemd-logind
echo -e "${GREEN}已恢复系统默认设置${NC}"
}
# 检查休眠功能支持
check_hibernate_support() {
echo -e "\n${BLUE}=== 检查休眠支持 ===${NC}"
# 检查swap
echo -e "${CYAN}交换空间:${NC}"
swapon --show
# 检查hibernate支持
if [ -f /sys/power/state ]; then
echo -e "\n${CYAN}支持的电源状态:${NC}"
cat /sys/power/state
fi
# 检查是否配置了resume
if [ -f /proc/cmdline ]; then
if grep -q "resume" /proc/cmdline; then
echo -e "\n${GREEN}已配置休眠恢复参数${NC}"
else
echo -e "\n${YELLOW}未配置休眠恢复参数${NC}"
fi
fi
}
# 设置休眠(如果需要)
setup_hibernate() {
echo -e "\n${YELLOW}注意:要使用休眠功能,需要正确配置交换空间${NC}"
echo "当前交换空间信息:"
swapon --show
read -p "是否查看休眠配置指南? (y/N): " choice
if [ "$choice" = "y" ] || [ "$choice" = "Y" ]; then
echo -e "\n${CYAN}基本休眠配置步骤:${NC}"
echo "1. 确保交换分区大小 >= 内存大小"
echo "2. 编辑 /etc/default/grub,添加 resume=交换分区设备"
echo "3. 运行 update-grub 或 grub-mkconfig"
echo "4. 重启系统"
echo ""
echo "例如:GRUB_CMDLINE_LINUX_DEFAULT=\"resume=/dev/sda2\""
fi
}
# 测试功能
test_lid_behavior() {
echo -e "\n${YELLOW}=== 关盖行为测试 ===${NC}"
echo "此功能需要您手动合上笔记本盖子进行测试。"
echo ""
echo -e "${RED}警告:测试前请保存所有工作!${NC}"
echo ""
echo "测试步骤:"
echo "1. 保持终端窗口打开"
echo "2. 合上笔记本盖子"
echo "3. 等待5-10秒"
echo "4. 打开盖子"
echo "5. 检查系统状态"
echo ""
# 倒计时
for i in {5..1}; do
echo -ne "\r测试将在 $i 秒后开始(按 Ctrl+C 取消)..."
sleep 1
done
echo ""
echo -e "\n${GREEN}开始测试...${NC}"
echo "测试开始时间: $(date)"
echo -e "${YELLOW}请在5秒内合上笔记本盖子...${NC}"
sleep 5
echo -e "\n${CYAN}测试结果:${NC}"
echo "当前时间: $(date)"
echo -e "${GREEN}如果看到此消息,说明:${NC}"
echo "1. 系统检测到盖子关闭事件"
echo "2. 当前设置允许系统保持唤醒状态"
echo ""
echo "要验证设置是否完全生效,可以:"
echo "1. 等待更长时间(30-60秒)"
echo "2. 查看系统日志:journalctl -u systemd-logind --since \"5 minutes ago\""
read -p "是否查看最近的相关日志? (y/N): " view_logs
if [ "$view_logs" = "y" ] || [ "$view_logs" = "Y" ]; then
journalctl -u systemd-logind --since "5 minutes ago" --no-pager | tail -20
fi
}
# 查看日志
view_logs() {
echo -e "\n${BLUE}=== 查看相关日志 ===${NC}"
echo "1) 查看systemd-logind服务状态"
echo "2) 查看系统日志中的关盖事件(最近1小时)"
echo "3) 查看内核日志(关盖相关)"
echo "4) 实时监控日志(按Ctrl+C退出)"
echo "5) 返回主菜单"
read -p "请选择 (1-5): " log_choice
case $log_choice in
1)
echo -e "\n${YELLOW}systemd-logind 服务状态:${NC}"
systemctl status systemd-logind --no-pager -l
;;
2)
echo -e "\n${YELLOW}最近的系统日志(关盖相关):${NC}"
journalctl -u systemd-logind --since "1 hour ago" | grep -i "lid\|sleep\|suspend\|lock" | tail -30
;;
3)
echo -e "\n${YELLOW}内核日志(关盖相关):${NC}"
dmesg | grep -i "lid\|acpi" | tail -20
;;
4)
echo -e "\n${YELLOW}开始实时监控日志(按Ctrl+C退出)...${NC}"
journalctl -u systemd-logind -f
;;
5)
return
;;
*)
echo -e "${RED}无效选择${NC}"
;;
esac
read -p "按回车键继续..."
}
# 显示菜单
show_menu() {
clear
echo -e "${BLUE}=================================${NC}"
echo -e "${BLUE} Linux笔记本关盖休眠设置工具 ${NC}"
echo -e "${BLUE}=================================${NC}"
echo ""
show_system_info
show_current_settings
echo -e "\n${GREEN}请选择操作:${NC}"
echo "1) 启用关盖休眠(默认)"
echo "2) 禁用关盖休眠(关盖时不操作)"
echo "3) 设置自定义关盖行为"
echo "4) 检查休眠功能支持"
echo "5) 恢复系统默认设置"
echo "6) 显示当前设置"
echo "7) 测试关盖行为"
echo "8) 查看日志"
echo "9) 退出"
echo ""
}
# 主函数
main() {
# 检查root权限
check_root
# 检查systemd
if ! command -v systemctl &> /dev/null; then
echo -e "${RED}错误:未找到systemd,此脚本需要systemd系统${NC}"
exit 1
fi
while true; do
show_menu
read -p "请输入选项编号 (1-9): " choice
case $choice in
1)
enable_lid_suspend
;;
2)
disable_lid_suspend
;;
3)
set_custom_behavior
;;
4)
check_hibernate_support
read -p "是否设置休眠功能? (y/N): " hibernate_choice
if [ "$hibernate_choice" = "y" ] || [ "$hibernate_choice" = "Y" ]; then
setup_hibernate
fi
;;
5)
restore_default
;;
6)
show_current_settings
;;
7)
test_lid_behavior
;;
8)
view_logs
continue # 不暂停,直接返回菜单
;;
9)
echo -e "\n${GREEN}感谢使用,再见!${NC}"
exit 0
;;
*)
echo -e "${RED}无效选项,请重新输入${NC}"
;;
esac
# 暂停一下让用户看到结果
if [ "$choice" != "8" ]; then
read -p "按回车键继续..."
fi
done
}
# 显示使用说明
show_usage() {
echo -e "${BLUE}Linux笔记本关盖休眠设置脚本${NC}"
echo "版本: 2.0"
echo "适用于支持systemd的Linux发行版"
echo ""
echo "用法:"
echo " $0 [选项]"
echo ""
echo "选项:"
echo " --enable 启用关盖休眠"
echo " --disable 禁用关盖休眠"
echo " --status 显示当前设置"
echo " --check-hibernate 检查休眠支持"
echo " --help, -h 显示此帮助信息"
echo ""
echo "示例:"
echo " sudo $0 --enable"
echo " sudo $0 --status"
echo " sudo $0 --check-hibernate"
echo ""
echo "支持的发行版:"
echo " Ubuntu, Debian, Fedora, CentOS, Arch Linux, openSUSE等"
}
# 处理命令行参数
case "$1" in
"--enable")
check_root
enable_lid_suspend
;;
"--disable")
check_root
disable_lid_suspend
;;
"--status")
check_root
show_system_info
show_current_settings
;;
"--check-hibernate")
check_root
check_hibernate_support
;;
"--help"|"-h")
show_usage
exit 0
;;
"")
# 无参数,进入交互模式
main
;;
*)
echo -e "${RED}未知参数: $1${NC}"
show_usage
exit 1
;;
esac
使用方法
交互式菜单模式(推荐):
sudo bash lid-control.sh
命令行模式:
# 启用关盖休眠
sudo bash lid-control.sh --enable
# 禁用关盖休眠
sudo bash lid-control.sh --disable
# 查看当前设置
sudo bash lid-control.sh --status
# 检查休眠支持
sudo bash lid-control.sh --check-hibernate
# 显示帮助信息
sudo bash lid-control.sh --help
本文共9818个字符,其中有 1688 个汉字,平均阅读时长 ≈ 38分钟
评论