Linux系统笔记本关盖休眠交互式脚本

Linux系统笔记本关盖休眠交互式脚本

陌路离殇
2025-08-20 / 0 评论 / 3 阅读
#!/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分钟
0

打赏

海报

正在生成.....

评论

博主关闭了所有页面的评论

网站公告

欢迎访问本站

  • 如果你有教程想要分享,请联系我们