Shutdown

為什麼這個關閉腳本在 ACPID 執行時不起作用?

  • August 23, 2013

基於這個執行緒我修改了我的/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
}

不幸的是,我現在對pinkyLinux 下的使用者管理還不夠了解,無法判斷這種解決方法是否會產生更多問題。我想這比將使用者名硬編碼並顯示到文件中要好(當我嘗試時它甚至不起作用)。

引用自:https://unix.stackexchange.com/questions/87259