Shutdown
為什麼這個關閉腳本在 ACPID 執行時不起作用?
基於這個執行緒我修改了我的
/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 啟動命令之前工作。
系統資訊:
- Ubuntu 12.04.2 LTS
- 單使用者
- 執行 LXDE/Openbox
編輯:
我執行了一些診斷程序,發現在 ACPID 執行時 XUSER 和 XAUTHORITY 都保持為空。不過不知道為什麼。
因此,經過一些調試工作,我終於能夠將問題追溯到使用者檢測到
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 }
不幸的是,我現在對
pinky
Linux 下的使用者管理還不夠了解,無法判斷這種解決方法是否會產生更多問題。我想這比將使用者名硬編碼並顯示到文件中要好(當我嘗試時它甚至不起作用)。