
Eu tenho um daemon, implementado no bash e rodando por meio da cron
opção @reboot
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 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 grep
linha 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 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. 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 logind
serviço. 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 de Sessão/Assento/Usuário.
Responder2
Use o script de inicialização da sessão de login ~/.xprofile
para criar algum arquivo de sinalização para você. Seja como for ~/.xlogin_flag
, em seu outro script use inotifywatch
from package inotify-tools
para vê-lo sendo criado, tocado ou excluído.
Responder3
Verifique a saída do w
comando. 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