Por que este script de desligamento não funciona quando executado pelo ACPID?

3

Com base em este tópico , modifiquei meu script /etc/acpi/powerbtn.sh para considerar o LXDE sessões:

# 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"

O script funciona bem quando executado em um terminal - tanto como usuário quanto como root - mas não funciona se for executado por ACPID.

O único caso em que o script é acionado pela ACPI é quando eu tenho uma sessão raiz aberta no gnome-terminal.

Você tem alguma ideia do que poderia estar errado? Existe alguma outra informação que eu possa fornecer para ajudá-lo a descobrir o que está acontecendo?

Eu tentei configurar as variáveis de ambiente manualmente, mas se eu fizer isso, o script só funcionará até a primeira vez que eu iniciar um comando com root.

Informações do sistema:

  • Ubuntu 12.04.2 LTS

  • usuário único

  • executando o LXDE / Openbox

Editar :

Eu executei alguns diagnósticos e descobri que XUSER e XAUTHORITY permanecem vazios quando executados pelo ACPID. Não sei por que, no entanto.

    
por Glutanimate 18.08.2013 / 19:07

1 resposta

0

Então, depois de algum trabalho de depuração, finalmente pude rastrear o problema até a detecção do usuário por pinky . Por alguma razão estranha pinky -fw não listará a exibição do usuário em circunstâncias normais. Somente depois de iniciar uma sessão de raiz é possível detectar a exibição correta:

# 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
##################

Esta é a solução que apliquei:

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
}

Infelizmente, ainda não sei o suficiente sobre pinky e gerenciamento de usuários no Linux para saber se essa solução alternativa pode criar ainda mais problemas. Eu acho que é melhor do que simplesmente codificar o nome do usuário e exibir no arquivo (que nem funcionou quando eu tentei).

    
por 23.08.2013 / 13:41