Como detectar scripts quando a área de trabalho do usuário é carregada?

10

Eu tenho um daemon, implementado no bash e executando por meio de cron e a opção @reboot , que mostra a área de trabalho inativa. O script é o seguinte (os prazos são curtos para fins de teste):

#!/bin/bash
P_STATE=0
while :
do
    sleep 5
    if [ $P_STATE == 0 ]; then
         [ 'xprintidle' -ge 25000 ] && P_STATE=1 && wmctrl -k on
    else
         [ 'xprintidle' -le 25000 ] && P_STATE=0
done

Problema: Se um usuário ainda estiver, por exemplo, na tela de login, xprintidle e wmctrl falharão, pois a área de trabalho ainda não está carregada. Para evitar isso, coloquei as próximas linhas no início do script:

while:
do
    sleep 10s
    [ -n 'who | grep "$USER"' ] && break
done

Assim, o script espera que o usuário (a variável USER está configurada para meu nome de usuário no arquivo crontab) seja registrado. Mas, se um usuário começar, por exemplo, uma sessão de terminal (e não uma sessão gráfica como o KDE ou o GNOME), o script também continuará.

Como posso determinar se um usuário já está em uma sessão "gráfica" capaz de "mostrar o modo de área de trabalho" ou não? E além disso, como posso garantir que uma sessão "gráfica" esteja completamente carregada e não em processo de carregamento ou algo assim?

Minha solução: Minha solução (informal) está adicionando no loop principal a linha grep :

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "'ps -ef | grep "$WM_CMD" | grep -v "grep"'" ] && continue

    ## My actions here
done

Sendo "$ WM_CMD" o comando gerenciador do Windows . Presumo que, se o comando do gerenciador do Windows estiver em execução no sistema, significa que a área de trabalho está completamente carregada e que qualquer comando "gráfico" é seguro.

Onde a variável WM_CMD é definida? Na linha crontab :

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

Mas também acho que seria possível detectar o "comando do gerenciador do Windows" por meio de outras solicitações do sistema. No entanto, para mim, definir WM_CMD no arquivo crontab é suficiente.

    
por Peregring-lk 18.04.2013 / 15:36

5 respostas

2

Tente usar o D-Bus para consultar as informações da sessão em logind service. Possui org.freedesktop.login1.Manager interface com vários sinais como SessionNew e SeatNew . org.freedesktop.login1.Seat e org.freedesktop.login1.User interfaces. Pode ajudar a obter o estado Sessão / Assento / Usuário.

    
por 06.12.2013 / 09:46
0

Use o script de inicialização da sessão de login ~/.xprofile para criar um arquivo de sinalizador para você. Seja ~/.xlogin_flag , então em seu outro script use inotifywatch do pacote inotify-tools para ver se está sendo criado, tocado ou excluído.

    
por 18.05.2013 / 14:49
0

Verifique a saída do comando w . Você verá o tipo de login (exibição X) no campo LOGIN @.

    
por 18.05.2013 / 14:52
0

Acho que a maneira mais simples de verificar se um usuário está conectado no X11 é verificar os processos que gravam em $HOME/.xsession-errors desde quando você faz login graficamente, tudo o que você stderr é redirecionado lá.

Caso contrário, basta usar o comando w , como já sugerido por @Grzegorz: se a coluna FROM começar com : , então é uma sessão gráfica.

    
por 22.11.2013 / 10:06
0

Verifique no diretório de tempo de execução do lightdm. No Arch com systemd e lightdm, quando um usuário efetua login, um arquivo xauthority é criado.

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

Você pode testar isso com algo assim em seu loop while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
    
por 12.12.2013 / 06:22