Як розпізнати скрипт при завантаженні робочого столу користувача?


11

У мене є демон, реалізований в 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 досить.


Який менеджер входу ви використовуєте?
mtahmed

Мій менеджер для входу в системуlightdm
Peregring-lk

Це питання щодо суперкористувача може вам допомогти. Я не впевнений, що він відповість на ваше запитання повністю.
Rany Albeg Wein

1
Це не особливо надійно, але ви можете перевірити процес Gnome / KDE ...
jasonwryan

1
Вам слід задокументувати, що ви зробили як відповідь; це може допомогти іншим.
Jasonwryan

Відповіді:


2

Спробуйте використовувати D-Bus для запиту інформації про сеанси в logindсервісі. Він має org.freedesktop.login1.Managerінтерфейс з декількома сигналами, як SessionNewі SeatNew. org.freedesktop.login1.Seatта org.freedesktop.login1.Userінтерфейси. Це може допомогти отримати стан сесії / сидіння / користувача.


1

Використовуйте сценарій запуску сеансу входу, ~/.xprofileщоб створити для вас якийсь файл прапора. Будь-то ~/.xlogin_flag, тоді в іншому сценарії використовуйте inotifywatchз пакета, inotify-toolsщоб побачити його створення, торкання чи видалення.


1

Перевірте вихід wкоманди. Ви побачите тип входу (відображення X) у полі ВХОДИТИ @.


1

Я думаю, що найпростіший спосіб перевірити, чи є користувач підключений у X11, - це перевірити процеси, на які записується з $HOME/.xsession-errorsтих пір, коли ви входите в систему графічно, все, що ви stderr, перенаправляється туди.

В іншому випадку просто використовуйте wкоманду, як уже запропонував @Grzegorz: якщо FROMстовпець починається з :цього, це графічний сеанс.


0

Перевірте в каталозі виконання програми lightdm. У Arch із systemd та lightdm, коли користувач входить у систему, створюється файл 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

Ви можете перевірити для цього щось подібне у циклі while.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.