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

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

Eu tenho um daemon, implementado no bash e rodando por meio da cronopção @rebootque 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 porque a área de trabalho ainda não foi carregada. Para evitar isso, coloquei as próximas linhas logo 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 logado. Mas, se um usuário iniciar, por exemplo, uma sessão de terminal (e não uma sessão gráfica como KDE ou 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 desktop" ou não? Além disso, como posso garantir que uma sessão "gráfica" esteja completamente carregada e não em processo de carregamento ou algo parecido?

Minha solução: Minha solução (informal) é adicionar a greplinha no loop principal:

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 alvocomando do gerenciador de janelas. Presumo que, se ocomando do gerenciador de janelasestá 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. Porém, para mim definir WM_CMD no arquivo crontab é suficiente.

Responder1

Tente usar o D-Bus para consultar informações de 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 de Sessão/Assento/Usuário.

Responder2

Use o script de inicialização da sessão de login ~/.xprofilepara criar algum arquivo de sinalização para você. Seja como for ~/.xlogin_flag, em seu outro script use inotifywatchfrom package inotify-toolspara vê-lo sendo criado, tocado ou excluído.

Responder3

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

Responder4

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ê poderia testar isso com algo assim em seu loop while.

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

informação relacionada