Eu tenho um daemon, implementado no bash e em execução por meio de cron
e a @reboot
opçã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, xprintidle
e wmctrl
falhar, 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 grep
linha:
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 crontab
linha:
@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.
lightdm