Ho un demone, implementato in bash e funzionante tramite cron
e l' @reboot
opzione, che mostra il desktop inattivo. Lo script è il seguente (i tempi sono brevi a scopo di test):
#!/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 un utente è ancora, ad esempio, nella schermata di accesso xprintidle
e ha wmctrl
esito negativo poiché il desktop non è ancora stato caricato. Per evitarlo, ho messo le righe seguenti all'inizio dello script:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Quindi, lo script attende che l'utente (la variabile USER sia impostata sul mio nome utente nel file crontab) sia registrata. Tuttavia, se un utente inizia, ad esempio, una sessione terminale (e non una sessione grafica come KDE o GNOME), lo script continua anche.
Come posso determinare se un utente è già in una sessione "grafica" in grado di "mostrare la modalità desktop" o no? Inoltre, come posso garantire che una sessione "grafica" sia completamente caricata e non in fase di caricamento o qualcosa del genere?
La mia soluzione: la mia soluzione
(informale) sta aggiungendo nel loop principale la grep
riga:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
Essendo "$ WM_CMD" il comando gestore finestre di destinazione . Suppongo che, se il comando di Windows Manager è in esecuzione nel sistema, significa che il desktop è completamente caricato e qualsiasi comando "grafico" è sicuro.
Dove viene definita la variabile WM_CMD? Nella crontab
linea:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
Ma penso anche che sarebbe possibile rilevare il "comando di Windows Manager" tramite altre richieste di sistema. Tuttavia, per me definire WM_CMD nel file crontab è sufficiente.
lightdm