概述
有多种方法可以解决此问题。如果您浏览网络,您会发现有关安装在其他桌面环境 (DE) 中使用的电源管理器的建议,例如xfce4-power-manager或gnome-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 运行(设置环境变量,如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
<...>
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
进一步阅读
https://bugs.launchpad.net/xfce4-power-manager/+bug/1008650
| 归档时间: |
|
| 查看次数: |
7765 次 |
| 最近记录: |