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.