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
Respostas:
Tente usar o D-Bus para consultar informações da sessão do
logind
serviço. Possuiorg.freedesktop.login1.Manager
interface com vários sinais comoSessionNew
eSeatNew
.org.freedesktop.login1.Seat
eorg.freedesktop.login1.User
interfaces. Pode ajudar a obter o estado da Sessão / Lugar / Usuário.fonte
Use o script de inicialização da sessão de login
~/.xprofile
para criar algum arquivo de sinalizador para você. Seja~/.xlogin_flag
, então, em seu outro script, use ainotifywatch
partir do pacoteinotify-tools
para vê-lo sendo criado, tocado ou excluído.fonte
Verifique a saída do
w
comando. Você verá o tipo de login (exibição X) no campo LOGIN @.fonte
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-errors
desde quando você faz login graficamente, tudo o que stderr é redirecionado para lá.Caso contrário, basta usar o
w
comando, como já sugerido por @Grzegorz: se aFROM
coluna iniciar:
, será uma sessão gráfica.fonte
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.
Você pode testar isso com algo assim no seu loop while.
fonte