ACPID가 실행될 때 이 종료 스크립트가 작동하지 않는 이유는 무엇입니까?

ACPID가 실행될 때 이 종료 스크립트가 작동하지 않는 이유는 무엇입니까?

기반으로이 스레드/etc/acpi/powerbtn.shLXDE 세션을 고려하도록 스크립트를 수정했습니다 .

# 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에서의 사용자 관리에 대해 이 해결 방법으로 인해 더 많은 문제가 발생할지 여부를 알 수 있을 만큼 충분하지 않습니다 . 나는 이것이 단지 사용자 이름을 하드코딩하여 파일에 표시하는 것보다 낫다고 생각합니다(시도했을 때 작동하지도 않았습니다).

관련 정보