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

11

Eu tenho um daemon, implementado no bash e em execução por meio de crone a @rebootopção, que mostra a área de trabalho em inatividade. O script é o seguinte (os tempos 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, xprintidlee wmctrlfalhar, pois a área de trabalho ainda não foi carregada. Para evitar isso, eu coloquei as próximas linhas no início do script:

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

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

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? Além disso, como posso garantir que uma sessão "gráfica" esteja completamente carregada e não esteja em processo de carregamento ou algo assim?

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

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 do gerenciador de janelas de destino . Presumo que, se o comando do gerenciador do Windows estiver sendo executado no sistema, significa que a área de trabalho está completamente carregada e qualquer comando "gráfico" é certo.

Onde a variável WM_CMD é definida? Na crontablinha:

 @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 de janelas" por meio de outras solicitações do sistema. No entanto, para mim, definir WM_CMD no arquivo crontab é suficiente.

Peregring-lk
fonte
Qual gerenciador de login você está usando?
mtahmed
Meu gerenciador de login élightdm
Peregring-lk
Esta pergunta de superusuário pode ser útil para você. Não tenho certeza de que responderá sua pergunta completamente.
precisa saber é o seguinte
1
Não é particularmente robusto, mas você pode verificar o processo Gnome / KDE ...
jasonwryan
1
Você deve documentar o que fez como resposta; isso pode ajudar os outros.
precisa saber é o seguinte

Respostas:

2

Tente usar o D-Bus para consultar informações da sessão do logindserviço. Possui org.freedesktop.login1.Managerinterface com vários sinais como SessionNewe SeatNew. org.freedesktop.login1.Seate org.freedesktop.login1.Userinterfaces. Pode ajudar a obter o estado da Sessão / Lugar / Usuário.

crazyh
fonte
1

Use o script de inicialização da sessão de login ~/.xprofilepara criar algum arquivo de sinalizador para você. Seja ~/.xlogin_flag, então, em seu outro script, use a inotifywatchpartir do pacote inotify-toolspara vê-lo sendo criado, tocado ou excluído.

Grzegorz Żur
fonte
1

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

Grzegorz Żur
fonte
1

Eu acho que a maneira mais simples de verificar se um usuário está conectado no X11 é verificar se há processos que gravam, $HOME/.xsession-errorsdesde quando você faz login graficamente, tudo o que stderr é redirecionado para lá.

Caso contrário, basta usar o wcomando, como já sugerido por @Grzegorz: se a FROMcoluna iniciar :, será uma sessão gráfica.

eppesuig
fonte
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 no seu loop while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Carlwgeorge
fonte