Jak wykryć ze skryptu, gdy pulpit użytkownika jest załadowany?

11

Mam demona, zaimplementowanego w bash i działającego za pomocą croni @rebootopcji, która pokazuje pulpit nieaktywny. Skrypt wygląda następująco (terminy są krótkie do celów testowych):

#!/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

Problem: jeśli użytkownik wciąż jest na przykład na ekranie logowania xprintidlei wmctrlnie działa, ponieważ pulpit nie jest jeszcze załadowany. Aby tego uniknąć, umieściłem kolejne wiersze na samym początku skryptu:

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

Tak więc skrypt czeka, aż użytkownik (zmienna USER jest ustawiona na moją nazwę użytkownika w pliku crontab) zostanie zarejestrowany. Ale jeśli użytkownik rozpocznie na przykład sesję terminalową (a nie sesję graficzną, taką jak KDE lub GNOME), skrypt również będzie kontynuowany.

Jak mogę ustalić, czy użytkownik jest już w sesji „graficznej” zdolnej do „pokazywania trybu pulpitu”, czy nie? Co więcej, jak mogę się upewnić, że sesja „graficzna” jest całkowicie załadowana i nie jest w trakcie ładowania, czy coś w tym rodzaju?

Moje rozwiązanie: Moim (nieformalnym) rozwiązaniem jest dodanie w głównej pętli grepwiersza:

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

Będąc „$ WM_CMD”, polecenie docelowego menedżera systemu Windows . Zakładam, że jeśli polecenie menedżera systemu Windows jest uruchomione w systemie, oznacza to, że pulpit jest całkowicie załadowany i każde polecenie „graficzne” jest pewne.

Gdzie jest zdefiniowana zmienna WM_CMD? W crontablinii:

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

Ale również uważam, że możliwe byłoby wykrycie „polecenia menedżera systemu Windows” za pomocą innych żądań systemowych. Jednak dla mnie wystarczy zdefiniowanie WM_CMD w pliku crontab.

Peregring-Łk
źródło
Jakiego menedżera logowania używasz?
mtahmed 18.04.13
Mój menedżer logowania tolightdm
Peregring-lk
To pytanie superużytkownika może ci pomóc. Nie jestem jednak pewien, czy całkowicie odpowie na twoje pytanie.
Rany Albeg Wein
1
Nie jest szczególnie solidny, ale możesz sprawdzić proces Gnome / KDE ...
jasonwryan
1
Powinieneś udokumentować to, co zrobiłeś jako odpowiedź; może pomagać innym.
jasonwryan

Odpowiedzi:

2

Spróbuj użyć D-Bus do zapytania informacji o sesji z logindusługi. Ma org.freedesktop.login1.Managerinterfejs z kilkoma sygnałami, takimi jak SessionNewi SeatNew. org.freedesktop.login1.Seati org.freedesktop.login1.Userinterfejsy. Może pomóc uzyskać stan sesji / stanowiska / użytkownika.

crazyh
źródło
1

Użyj skryptu uruchamiania sesji logowania, ~/.xprofileaby utworzyć dla siebie plik flagi. Niech tak będzie ~/.xlogin_flag, a następnie użyj w drugim skrypcie inotifywatchz pakietu, inotify-toolsaby zobaczyć, jak jest tworzony, dotykany lub usuwany.

Grzegorz Żur
źródło
1

Sprawdź wyjście wpolecenia. Zobaczysz typ logowania (wyświetlacz X) w polu LOGIN @.

Grzegorz Żur
źródło
1

Myślę, że najprostszym sposobem sprawdzenia, czy użytkownik jest podłączony w X11, jest sprawdzenie procesów, do których piszą, $HOME/.xsession-errorsponieważ kiedy logujesz się graficznie, wszystkie stderr są tam przekierowywane.

W przeciwnym razie wystarczy użyć wpolecenia, jak już zasugerował @Grzegorz: jeśli FROMkolumna zaczyna się od, :to jest to sesja graficzna.

eppesuig
źródło
0

Sprawdź w katalogu środowiska uruchomieniowego lightdm. W Arch z systemd i lightdm, gdy użytkownik się loguje, tworzony jest plik 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

Możesz to sprawdzić za pomocą czegoś takiego w pętli while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Carlwgeorge
źródło