У меня есть сценарий, который работает через крон для изменения обоев для рабочего стола. Я могу заставить это работать путем экспорта переменной ДИСПЛЕЯ.
Но проблема, я обеспокоен этим, что сценарий должен работать над всеми системами. Как найти значение ДИСПЛЕЯ установленным X-сервером, не используя $DISPLAY?
Таким образом, как я могу найти правильное значение для DISPLAY
программно. Я могу заставить это работать только когда DISPLAY=:1
. Установка его к ":0"
заставляет сценарий выйти с
No protocol specified
Cannot open display.
Вы не можете наверняка. Необходимо сделать предположения.
Притворяются, что Вы cron
, и Вы сталкиваетесь с худшим вариантом развития событий за секунду: существуют многочисленные пользователи, зарегистрированные, и каждый пользователь выполняет приблизительно X сессий. Необходимо будет предположить пользователя (достаточно легкий, мы выполняем их crontab), и одна из X сессий того пользователя.
, Если мы хотим принять, пользователь работает один и только один X сессий от tty, и получите ту сессию $DISPLAY
значение, которое мы можем использовать w
:
USER TTY FROM LOGIN@ 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 && $2 ~ /tty[0-9]+/ {print $3; exit}'
:1
Так, принимая все вышеупомянутое:
0 0 * * * DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}') command
сделает cron
, выполняются command
с $DISPLAY
набор к первому X сессий, работающих в tty's $DISPLAY
значение, найденное для пользователя.
Для более детального обсуждения обратитесь к https://unix.stackexchange.com/questions/17255/is-there-a-command-to-list-all-open-displays-on-a-machine
, я просто перечислю релевантную информацию из того ответа здесь:
, кажется, существует два простых способа найти экземпляры X-сервера, работающие на Вашей системе.
w
:
Эти w
списки команд все открытые дисплеи. Можно затем использовать awk
для отфильтровывания информации, в которой Вы нуждаетесь. Значения под FROM
являются значениями, соответствующими DISPLAY
.
ashhar@xenon:[/tmp/.X11-unix]