我的电源按钮在 LXDE 下不起作用。我该如何修复?

我的电源按钮在 LXDE 下不起作用。我该如何修复?

自从我切换到 LXDE 后,我的电源按钮就不能用了。我希望能够显示一个像 Unity 和类似 DE 中的一样漂亮的注销菜单。我该如何实现呢?

答案1

ACPID 方式


概述

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

什么是 ACPID?

来自维基百科

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

  • 按特殊键,包括电源/睡眠/挂起按钮

  • 合上笔记本电脑盖 从笔记本电脑上拔下交流电源适配器

  • 拔(拔)电话插孔等等。

安装

sudo apt-get install acpi acpid

配置

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

gksudo leafpad /etc/acpi/powerbtn.sh

在该文件的末尾你会发现以下段落:

# If all else failed, just initiate a plain shutdown.
/sbin/shutdown -h now "Power button pressed"

在此段落之前添加以下片段:

# 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

大部分代码片段由函数和命令组成,确保注销菜单等图形应用程序可以通过 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
<...>

故障排除

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

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

环境变量在此是硬编码的。请确保将其替换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
}

它有什么作用?

每次按下电源按钮时,ACPID 都会触发该powerbtn.sh脚本。如您所见,它已经包含了许多针对常见桌面环境(如 Unity、GNOME 和 KDE)的检查。这些检查是为了确保关机事件由相应的电源管理器处理。可惜的是,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

答案2

似乎 LXDE 不包含 lxsession-logout 包。在终端中输入以下命令安装该包:

sudo apt install lxsession-logout

我知道这是一个老话题,但我刚刚遇到了这个问题,并且在任何地方都找不到直接的答案。

答案3

使用 systemd。只需编辑/etc/systemd/logind.conf,取消注释相关行HandlePowerKey,然后根据需要设置为poweroffsuspendhibernate即可。其中还有其他偏好设置,例如盖子开关等。

更多信息、选项


没有 systemd。w由于使用、pidofreadps不是通过 管道传输,这可能会得到无用的样式点sed

/etc/acpi/powerbtn.sh,最终检查和关闭部分之前。

# If LXDE is running execute lxsession-logout
IFS=" "
read -r user pid foo <<<$(ps u --no-headers -C lxsession)
if [ x"$user" != x"" ]; then
   read -r foo display foo <<<$(w -sh $user)
   if [ x"$XAUTHORITY" != x"" ]; then
       export DISPLAY="$display"
       export _LXSESSION_PID=$pid
       lxsession-logout
       exit
    fi
fi

故障排除。

为了排除故障,请将此代码片段保存为脚本并(假设您理解命令并且不会盲目地从互联网上执行代码)以 root 身份调用它。

相关内容