Comment détecter à partir d'un script lorsque le bureau de l'utilisateur est chargé?

11

J'ai un démon, implémenté en bash et fonctionnant au moyen de cronet l' @rebootoption, 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 xprintidleet 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 grepligne:

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 crontabligne:

 @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.

Peregring-lk
la source
Quel gestionnaire de connexion utilisez-vous?
mtahmed
Mon gestionnaire de connexion estlightdm
Peregring-lk
Cette question de super utilisateur peut vous être utile. Je ne suis pas sûr que cela répondra complètement à votre question.
Rany Albeg Wein
1
Ce n'est pas particulièrement robuste, mais vous pouvez vérifier le processus Gnome / KDE ...
jasonwryan
1
Vous devez documenter ce que vous avez fait comme réponse; cela peut aider les autres.
jasonwryan

Réponses:

2

Essayez d'utiliser D-Bus pour interroger les informations de session du logindservice. Il a une org.freedesktop.login1.Managerinterface avec plusieurs signaux comme SessionNewet SeatNew. org.freedesktop.login1.Seatet org.freedesktop.login1.Userinterfaces. Cela peut aider à obtenir l'état Session / Siège / Utilisateur.

crazyh
la source
1

Utilisez le script de démarrage de la session de connexion ~/.xprofilepour créer un fichier indicateur pour vous. Qu'il en soit ainsi ~/.xlogin_flag, dans votre autre script, utilisez le inotifywatchpackage inotify-toolspour voir qu'il est créé, touché ou supprimé.

Grzegorz Żur
la source
1

Vérifiez la sortie de la wcommande. Vous verrez le type de connexion (affichage X) dans le champ LOGIN @.

Grzegorz Żur
la source
1

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-errorsdepuis lorsque vous vous connectez graphiquement, tout ce que vous stderr y est redirigé.

Sinon, utilisez simplement la wcommande, comme déjà suggéré par @Grzegorz: si la FROMcolonne commence par :alors c'est une session graphique.

eppesuig
la source
0

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éé.

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

Vous pouvez tester cela avec quelque chose comme ça dans votre boucle while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Carlwgeorge
la source