У мене є демон, реалізований в bash і працює за допомогою cron
і @reboot
опції, яка показує робочий стіл в бездіяльності. Сценарій такий (терміни короткі для тестування):
#!/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
Проблема: Якщо користувач все ще знаходиться, наприклад, на екрані входу, xprintidle
і wmctrl
не працює, оскільки робочий стіл ще не завантажений. Щоб уникнути цього, я розмістив наступні рядки на самому початку сценарію:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
Отже, сценарій чекає, коли користувач (змінна USER встановлений на моє ім’я користувача у файлі crontab) записується в журнал. Але, якщо користувач починає, наприклад, термінальний сеанс (а не графічний сеанс на зразок KDE або GNOME), сценарій також продовжується.
Як я можу визначити, чи користувач уже перебуває на "графічному" сеансі, здатний "показувати режим робочого столу" чи ні? І крім того, як я можу гарантувати, що "графічний" сеанс буде повністю завантажений, а не в процесі завантаження чи щось подібне?
Моє рішення:
Моє (неформальне) рішення додає в основний цикл grep
рядок:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
Будучи "$ WM_CMD" цільовою командою Windows Manager . Я припускаю, що якщо команда windows manager працює в системі, це означає, що робочий стіл завантажений повністю, і будь-яка "графічна" команда впевнена.
Де визначена змінна WM_CMD? У crontab
рядку:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
Але також я думаю, що можна було б виявити "команду менеджера windows" за допомогою інших системних запитів. Однак для мене визначення WM_CMD у файлі crontab досить.
lightdm