我的电源按钮在 LXDE 下不起作用。我怎样才能解决这个问题?

Glu*_*ate 4 shutdown acpi lubuntu logout lxde

自从我切换到 LXDE 后,我的电源按钮就无法使用了。我希望能够像 Unity 和类似 DE 中的那样显示一个漂亮的注销菜单。我怎样才能做到这一点?

Glu*_*ate 5

ACPID方式


概述

有多种方法可以解决此问题。如果您浏览网络,您会发现有关安装在其他桌面环境 (DE) 中使用的电源管理器的建议,例如xfce4-power-managergnome-settings-daemon。然而,作为 LXDE 用户,您可能正在努力寻找一个轻量级的解决方案。在按下电源按钮时显示注销菜单的一种轻量级方法是使用 ACPID 脚本。

什么是 ACPID?

来自ArchWiki

acpid是一个灵活且可扩展的守护进程,用于传送 ACPI 事件。它侦听 /proc/acpi/event 并在事件发生时执行程序来处理该事件。这些事件由某些操作触发,例如:

  • 按特殊键,包括电源/睡眠/暂停按钮

  • 合上笔记本电脑盖 (Un)从笔记本电脑插入交流电源适配器

  • (Un) 插入电话插孔等。

安装

sudo apt-get install acpi acpid
Run Code Online (Sandbox Code Playgroud)

配置

/etc/acpi/powerbtn.sh在您选择的文本编辑器中打开,例如 Leafpad:

gksudo leafpad /etc/acpi/powerbtn.sh
Run Code Online (Sandbox Code Playgroud)

在文件的末尾,您将找到以下段落:

# If all else failed, just initiate a plain shutdown.
/sbin/shutdown -h now "Power button pressed"
Run Code Online (Sandbox Code Playgroud)

在本段之前添加以下代码段:

# If LXDE is running execute lxsession-logout
if [ -n $(pidof lxsession) ]; then
    for x in /tmp/.X11-unix/*; do
       displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
       getXuser;
       if [ x"$XAUTHORITY" != x"" ]; then
           export DISPLAY=":$displaynum"
           export _LXSESSION_PID=`pidof lxsession`
           lxsession-logout
           exit
       fi
    done
fi
Run Code Online (Sandbox Code Playgroud)

大部分代码片段由函数和命令组成,以确保像注销菜单这样的图形应用程序可以由 ACPID 运行(设置环境变量,如XUSERDISPLAY)。

注意:如果您在 LXDE 会话中运行 GNOME 组件(例如 nautilus、各种守护进程),会话检测可能会出错。在这些情况下,我建议您按以下方式插入代码:

  if pidof x $PMS > /dev/null; then
     if [ -n $(pidof lxsession) ]; then
        for x in /tmp/.X11-unix/*; do
           displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
           getXuser;
           if [ x"$XAUTHORITY" != x"" ]; then
           export DISPLAY=":$displaynum"
           export _LXSESSION_PID=`pidof lxsession`
           killall lxsession-logout
           lxsession-logout
           fi
        done
        echo "if correct"
        exit
             else
                 exit
     fi
<...>
Run Code Online (Sandbox Code Playgroud)

故障排除

由于某些未知原因,这些功能并不总是有效。在这种情况下,您必须将上面的代码段替换为以下代码段:

if [ -n $(pidof lxsession) ]; then
   export DISPLAY=:0
   export _LXSESSION_PID=$(pidof lxsession)
   export XUSER=user
   export XAUTHORITY=/home/user/.Xauthority
   lxsession-logout
   exit
fi
Run Code Online (Sandbox Code Playgroud)

环境变量是硬编码的。确保替换user为您自己的用户名。它应该适用于大多数单用户系统配置。

这是另一种解决方法,以防万一上述变体都不起作用。将getXuser函数替换为以下段落:

getXuser() {
        user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
        if [ x"$user" = x"" ]; then
                startx=`pgrep -n startx`
                if [ x"$startx" != x"" ]; then
                        user=`ps -o user --no-headers $startx`
                fi
        fi
        if [ x"$user" = x"" ]; then                           # lines added
               user=$(pinky -fw | awk '{ print $1; exit; }')  # lines added
        fi                                                    # lines added
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
        export XUSER=$user
}
Run Code Online (Sandbox Code Playgroud)

它有什么作用?

powerbtn.sh每次按下电源按钮时,ACPID 都会触发该脚本。正如您所看到的,它已经包含了许多对 Unity、GNOME 和 KDE 等常见 DE 的检查。这些检查是为了确保关闭事件由相应的电源管理器处理。唉,LXDE 没有内置其中之一。

这就是为什么我们添加了我们自己的一个片段来检查 ACPID。如果它检测到 LXDE 会话,它会确保您的 PC 不会立即关闭,而是启动您应该熟悉的注销菜单。

通过这些更改,您现在应该可以使用硬件电源按钮启动注销菜单 - 无需安装笨重的电源管理器。更好的是,这不会以任何方式干扰其他 DE。

来源

http://www.ollie-reardon.co.uk/lxde-tip-power-button-not-working/

https://wiki.archlinux.org/index.php/Acpid

http://forum.lxde.org/viewtopic.php?f=8&t=205


进一步阅读

Lubuntu - 电源按钮不会关闭计算机,

笔记本电脑电源按钮不起作用

https://bugs.launchpad.net/xfce4-power-manager/+bug/1008650

https://unix.stackexchange.com/questions/87259/why-wont-this-shutdown-script-work-when-executed-by-acpid