Ho un demone, implementato in bash e funzionante tramite crone l' @rebootopzione, 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 xprintidlee ha wmctrlesito 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 grepriga:
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 crontablinea:
@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