Как определить из скрипта, когда загружен рабочий стол пользователя?


11

У меня есть демон, реализованные в Баше и выполняются с помощью 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 работает в системе, это означает, что рабочий стол полностью загружен, и любая «графическая» команда уверена.

Где определяется переменная WM_CMD? В crontabстроке:

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

Но я также думаю, что можно было бы обнаружить «команду менеджера окон» с помощью других системных запросов. Однако для меня достаточно определения WM_CMD в файле crontab.


Какой менеджер входа вы используете?
mtahmed

Мой менеджер входаlightdm
Peregring-lk

Этот вопрос супер пользователя может помочь вам. Я не уверен, что он полностью ответит на ваш вопрос.
Рани Албег Вайн

1
Это не особенно надежно, но вы можете проверить процесс Gnome / KDE ...
jasonwryan

1
Вы должны задокументировать, что вы сделали в качестве ответа; это может помочь другим.
Джейсонвриан

Ответы:


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 дисплей) в поле LOGIN @.


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.