自从我切换到 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 运行(设置环境变量,如XUSER
和DISPLAY
)。
注意:如果您的 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
进一步阅读
答案2
似乎 LXDE 不包含 lxsession-logout 包。在终端中输入以下命令安装该包:
sudo apt install lxsession-logout
我知道这是一个老话题,但我刚刚遇到了这个问题,并且在任何地方都找不到直接的答案。
答案3
使用 systemd。只需编辑/etc/systemd/logind.conf
,取消注释相关行HandlePowerKey
,然后根据需要设置为poweroff
、suspend
或hibernate
即可。其中还有其他偏好设置,例如盖子开关等。
没有 systemd。w
由于使用、pidof
和read
而ps
不是通过 管道传输,这可能会得到无用的样式点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 身份调用它。