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

6

У меня есть сценарий, который работает через cron, чтобы изменить обои для рабочего стола. Я могу заставить его работать, экспортируя переменную DISPLAY.

Но проблема в том, что сценарий должен работать на всех системах. Как найти значение DISPLAY, установленного сервером X, без использования $ DISPLAY?

Итак, как я могу найти правильное значение для DISPLAY программно. Я могу заставить его работать только тогда, когда DISPLAY=:1 . Установив его в ":0" , выйдите из сценария с помощью

No protocol specified
Cannot open display.
    
задан Ashhar Hasan 11.03.2016 в 16:11
источник

2 ответа

5

Вы не можете точно. Вы должны сделать предположения.

Предположите, что вы cron , и вы столкнулись с наихудшим сценарием на секунду: вошло несколько пользователей, и каждый пользователь запускает несколько сеансов X. Вам нужно угадать пользователя (достаточно просто, мы выполняем их crontab) и одну из X сессий этого пользователя.

Если мы хотим предположить, что пользователь запускает один и только один сеанс X из tty и получает значение $DISPLAY этого сеанса, мы можем использовать w :

USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
user     tty1                      16:32    7:15   0.21s  0.19s -zsh
user     tty2     :1               15:52   48:13   2:17   0.08s /sbin/upstart
user     pts/3    :1               16:19    0.00s  0.66s  0.00s w

Например, здесь я вошел в систему на tty1, на tty2 (где я запускаю сеанс X) и на pts / 3 (терминал, с которого я запускаю команду).

С немного разбора:

% w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}'
:1

Итак, предполагая все вышеперечисленное:

0 0 * * * DISPLAY=$(w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}') command

Сделает cron выполнит command с $DISPLAY , установленным для первого сеанса X, запущенного в значении $DISPLAY tty, найденном для пользователя.

    
ответ дан kos 11.03.2016 в 17:12
источник
1

Для более подробного обсуждения см. Ссылка

Я просто перечислю соответствующую информацию из этого ответа здесь:

Кажется, есть два простых способа найти экземпляры X-сервера, запущенные в вашей системе.

  • w :
    Команда w отображает все открытые дисплеи. Затем вы можете использовать awk , чтобы отфильтровать нужную вам информацию. Значениями под FROM являются значения, соответствующие DISPLAY .

    [email protected]:[/tmp/.X11-unix]                                    
ответ дан Ashhar Hasan 11.03.2016 в 16:52