기반으로이 스레드/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에서 루트 세션을 열 때입니다.
무엇이 잘못될 수 있는지 아시나요? 현재 상황을 이해하는 데 도움이 되도록 제가 제공할 수 있는 추가 정보가 있습니까?
환경 변수를 수동으로 설정하려고 시도했지만 그렇게 하면 처음으로 루트로 명령을 시작할 때까지만 스크립트가 작동합니다.
시스템 메시지:
우분투 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
}
pinky
불행하게도 저는 현재 Linux에서의 사용자 관리에 대해 이 해결 방법으로 인해 더 많은 문제가 발생할지 여부를 알 수 있을 만큼 충분하지 않습니다 . 나는 이것이 단지 사용자 이름을 하드코딩하여 파일에 표시하는 것보다 낫다고 생각합니다(시도했을 때 작동하지도 않았습니다).