Come rilevare dallo script quando viene caricato il desktop dell'utente?


11

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.


Quale gestore degli accessi stai usando?
mtahmed,

Il mio login manager èlightdm
Peregring-lk,

Questa domanda da superutente potrebbe esserti di aiuto. Non sono sicuro che risponderà alla tua domanda completamente però.
Rany Albeg Wein,

1
Non è particolarmente robusto, ma potresti verificare il processo Gnome / KDE ...
jasonwryan,

1
Dovresti documentare cosa hai fatto come risposta; può aiutare gli altri.
Jasonwryan,

Risposte:


2

Prova a utilizzare D-Bus per richiedere informazioni sulla sessione dal logindservizio. Ha org.freedesktop.login1.Managerun'interfaccia con diversi segnali come SessionNewe SeatNew. org.freedesktop.login1.Seate org.freedesktop.login1.Userinterfacce. Può aiutare a ottenere lo stato Sessione / Posto / Utente.


1

Utilizza lo script di avvio della sessione di accesso ~/.xprofileper creare alcuni file flag per te. Sia ~/.xlogin_flag, quindi nell'altro tuo script usa inotifywatchdal pacchetto inotify-toolsper vederlo essere creato, toccato o eliminato.


1

Controlla l'output del wcomando. Vedrai il tipo di accesso (display X) nel campo LOGIN @.


1

Penso che il modo più semplice per verificare se un utente è connesso in X11 sia quello di verificare i processi a cui si scrive $HOME/.xsession-errorsda quando si accede graficamente, tutto ciò che stderr viene reindirizzato lì.

Altrimenti basta usare il wcomando, come già suggerito da @Grzegorz: se la FROMcolonna inizia con :allora è una sessione grafica.


0

Controlla nella directory di runtime di lightdm. Su Arch con systemd e lightdm, quando un utente accede, viene creato un file xauthority.

$ 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

Potresti provare questo con qualcosa del genere nel tuo ciclo while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.