基于这个线程我修改了/etc/acpi/powerbtn.sh
脚本以考虑 LXDE 会话:
# getXuser gets the X user belonging to the display in $displaynum.
# If you want the foreground X user, use getXconsole!
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
userhome=`getent passwd $user | cut -d: -f6`
export XAUTHORITY=$userhome/.Xauthority
else
export XAUTHORITY=""
fi
export XUSER=$user
}
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
# If all else failed, just initiate a plain shutdown.
/sbin/shutdown -h now "Power button pressed"
该脚本在终端中运行时工作正常 - 无论是作为用户还是 root - 但如果由 ACPID 运行则无法工作。
由 ACPI 触发脚本的唯一情况是当我在 gnome-terminal 中打开 root 会话时。
您知道可能出了什么问题吗?我可以提供任何其他信息来帮助您了解发生了什么事吗?
我尝试手动设置环境变量,但如果这样做,脚本只能在我第一次使用 root 启动命令之前有效。
系统信息:
Ubuntu 12.04.2 LTS
单用户
运行 LXDE/Openbox
编辑:
我运行了一些诊断,发现由 ACPID 运行时 XUSER 和 XAUTHORITY 都保持为空。但不知道为什么。
答案1
因此,经过一些调试工作,我终于能够将问题追溯到用户检测pinky
。由于某些奇怪的原因pinky -fw
不会列出正常情况下的用户显示。只有启动根会话后,它才能检测到正确的显示:
# DEBUG OUTPUT WITHOUT ROOT SESSION
##################
displaynum: 0 # correct
##################
pinkyfw: bob tty7 04:09 Aug 18 17:59
pinky: Login Name TTY Idle When Where
bob Bob tty7 04:09 Aug 18 17:59 # notice the missing
################## # information on display used
pinkytest: bob # testing a workaround
user: # empty because awk didin't find a match for ":0" in pinky -fw
##################
# DEBUG OUTPUT WITH ROOT SESSION
##################
displaynum: 0 # correct
##################
pinkyfw: bob tty7 04:04 Aug 18 17:59
bob pts/3 Aug 18 21:59 :0
pinky: Login Name TTY Idle When Where
bob Bob tty7 04:04 Aug 18 17:59
bob Bob pts/3 Aug 18 21:59 :0 # after starting a root session
##################
pinkytest: bob
user: bob # awk found a match for ":0"
##################
# DEBUG OUTPUT WITHOUT ROOT SESSION, WORKAROUND APPLIED
##################
displaynum: 0 # correct
##################
pinkyfw: bob tty7 04:09 Aug 18 17:59
pinky: Login Name TTY Idle When Where
bob Bob tty7 04:09 Aug 18 17:59
##################
pinkytest: bob
user: bob
##################
这是我应用的解决方法:
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
}
不幸的是,我现在对 Linux 下的用户管理了解不够,pinky
无法判断这种解决方法是否会产生更多问题。我想这比仅仅将用户名硬编码并显示到文件中要好(当我尝试时,这甚至不起作用)。