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

自从我切换到LXDE后,我的电源按钮将不再起作用。 我希望能够显示像Unity中类似DEs的花式注销菜单。 我怎样才能做到这一点?

ACPID方式


概观

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

什么是ACPID?

来自ArchWiki :

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

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

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

  • (联合国)插入电话插孔等

安装

 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 <...> 

故障排除

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

 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等常见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

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

 sudo apt install lxsession-logout 

我知道这是一个老线程,但我刚刚遇到这个问题,无法在任何地方找到直接答案。