Есть хост, есть сервер. На хосте лежит программка reboot_alert.
Программка reboot_alert представляет собой окошечко с кнопкой на gtk, которое выводит сообщение.
reboot_alert запускается с помощью скрипта.
Вот, собственно, скрипт:
#!/bin/bash
dsp=$(who | grep -oE "\(:.\)" | grep -oE ":." | head -n 1)
$(DISPLAY=${dsp} /home/user/reboot_alert "Сейчас кто-то перезагрузится")
exit_code=$?
if [ "${exit_code}" == "0" ]; then
shutdown -r
fi
exit 1
Если запускать скрипт с хоста, проблем не возникает. Все работает.
Другое дело, если программа запускается с сервера (на хосте). Вылезает ошибка:
No protocol specified
Unable to init server: Не удалось подключиться к: В соединении отказано
(reboot_alert:2112): Gtk-[1;33mWARNING[0m **: [34m22:40:15.683[0m: cannot open display: :0
Ok. Ошибка, вроде, типичная. Гуглю.
После чего, ради избавления от ошибки, было решено использовать xhost +
. (Знаю, что нехорошо, но пока хотя бы так).
Но так как сервер запускает скрипт явно не в иксах, то была явно указана переменная DISPLAY: export DISPLAY:=0
. (В идеале активный DISPLAY должен определяться в скрипте, но в данном случае я точно знаю, что на хосте активен display :0).
Для проверки, что эта конструкция работает, был написан скрипт:
#!/bin/bash
DISPLAY=:0
export DISPLAY
xhost +
Запускаю скрипт с сервера и…
No protocol specified
xhost: unable to open display ":0"
Вот, собственно, и проблема.
Возможно, на это влияет то, что сервер запускает скрипт на хосте с помощью jail. Но тут я полный ноль.
Возможно, как вариант, можно написать скриптик, который будет запускать xhost +
в иксах сразу после их загрузки. Но это, на мой непрофессиональный взгляд, слишком большой костыль, недостойный жизни.
P.S. Если на хосте вручную прописать xhost +, а потом на сервере запустить скрипт, который запускает программу, все работает.
P.S.S. Знаю, что на форуме поднимали эту тему несколько раз. Не помогло.