J'ai un démon, implémenté en bash et fonctionnant au moyen de cron
et l' @reboot
option, qui montre le bureau en inactivité. Le script est le suivant (les délais sont courts à des fins de 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
Problème: Si un utilisateur est toujours, par exemple, dans l'écran de connexion xprintidle
et wmctrl
échoue car le bureau n'est pas encore chargé. Afin d'éviter cela, j'ai mis les lignes suivantes au tout début du script:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Ainsi, le script attend que l'utilisateur (la variable USER est définie sur mon nom d'utilisateur dans le fichier crontab) soit enregistré. Mais, si un utilisateur commence, par exemple, une session de terminal (et non une session graphique comme KDE ou GNOME), le script continue également.
Comment puis-je déterminer si un utilisateur est déjà dans une session "graphique" capable de "montrer le mode bureau" ou non? Et de plus, comment puis-je m'assurer qu'une session "graphique" est complètement chargée et pas en cours de chargement ou quelque chose comme ça?
Ma solution: Ma solution
(informelle) ajoute dans la boucle principale la grep
ligne:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
Étant "$ WM_CMD" la commande du gestionnaire de fenêtres cible . Je suppose que, si la commande du gestionnaire Windows est en cours d'exécution dans le système, cela signifie que le bureau est complètement chargé et que toute commande "graphique" est sûre.
Où la variable WM_CMD est-elle définie? Dans la crontab
ligne:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
Mais je pense aussi qu'il serait possible de détecter la "commande du gestionnaire de fenêtres" au moyen d'autres requêtes système. Cependant, pour moi, définir WM_CMD dans le fichier crontab est suffisant.
lightdm