Mam demona, zaimplementowanego w bash i działającego za pomocą cron
i @reboot
opcji, 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 xprintidle
i wmctrl
nie 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 grep
wiersza:
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 crontab
linii:
@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.
lightdm
Odpowiedzi:
Spróbuj użyć D-Bus do zapytania informacji o sesji z
logind
usługi. Maorg.freedesktop.login1.Manager
interfejs z kilkoma sygnałami, takimi jakSessionNew
iSeatNew
.org.freedesktop.login1.Seat
iorg.freedesktop.login1.User
interfejsy. Może pomóc uzyskać stan sesji / stanowiska / użytkownika.źródło
Użyj skryptu uruchamiania sesji logowania,
~/.xprofile
aby utworzyć dla siebie plik flagi. Niech tak będzie~/.xlogin_flag
, a następnie użyj w drugim skrypcieinotifywatch
z pakietu,inotify-tools
aby zobaczyć, jak jest tworzony, dotykany lub usuwany.źródło
Sprawdź wyjście
w
polecenia. Zobaczysz typ logowania (wyświetlacz X) w polu LOGIN @.źródło
Myślę, że najprostszym sposobem sprawdzenia, czy użytkownik jest podłączony w X11, jest sprawdzenie procesów, do których piszą,
$HOME/.xsession-errors
ponieważ kiedy logujesz się graficznie, wszystkie stderr są tam przekierowywane.W przeciwnym razie wystarczy użyć
w
polecenia, jak już zasugerował @Grzegorz: jeśliFROM
kolumna zaczyna się od,:
to jest to sesja graficzna.źródło
Sprawdź w katalogu środowiska uruchomieniowego lightdm. W Arch z systemd i lightdm, gdy użytkownik się loguje, tworzony jest plik xauthority.
Możesz to sprawdzić za pomocą czegoś takiego w pętli while.
źródło