このスレッドに基づいて/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"
スクリプトは、ターミナルで(ユーザーとルートの両方として)実行すると正常に機能しますが、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でのユーザー管理については、この回避策によってさらに問題が発生する可能性があるかどうかを判断するのに十分ではありません。ユーザー名をハードコーディングしてファイルに表示するよりも良いと思います(試しても機能しませんでした)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加