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