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
Réponses:
Essayez d'utiliser D-Bus pour interroger les informations de session du
logind
service. Il a uneorg.freedesktop.login1.Manager
interface avec plusieurs signaux commeSessionNew
etSeatNew
.org.freedesktop.login1.Seat
etorg.freedesktop.login1.User
interfaces. Cela peut aider à obtenir l'état Session / Siège / Utilisateur.la source
Utilisez le script de démarrage de la session de connexion
~/.xprofile
pour créer un fichier indicateur pour vous. Qu'il en soit ainsi~/.xlogin_flag
, dans votre autre script, utilisez leinotifywatch
packageinotify-tools
pour voir qu'il est créé, touché ou supprimé.la source
Vérifiez la sortie de la
w
commande. Vous verrez le type de connexion (affichage X) dans le champ LOGIN @.la source
Je pense que le moyen le plus simple de vérifier si un utilisateur est connecté dans X11 est de vérifier les processus qui écrivent
$HOME/.xsession-errors
depuis lorsque vous vous connectez graphiquement, tout ce que vous stderr y est redirigé.Sinon, utilisez simplement la
w
commande, comme déjà suggéré par @Grzegorz: si laFROM
colonne commence par:
alors c'est une session graphique.la source
Vérifiez dans le répertoire d'exécution de lightdm. Sur Arch avec systemd et lightdm, lorsqu'un utilisateur se connecte, un fichier xauthority est créé.
Vous pouvez tester cela avec quelque chose comme ça dans votre boucle while.
la source