Задание Cron: как запустить скрипт, требующий открытия дисплея?
Я хочу настроить задание cron для запуска скрипта на python, но оно дает мне такую ошибку:
RuntimeError: could not open display
Это потому, что я импортирую модуль, который требует от меня, чтобы открыть дисплей (pylab
, например). Несмотря на то, что мой сценарий не генерирует изображения для отображения на мониторе.
Есть ли способ позволить crontab запускать мои задания с открытым дисплеем (как будто я ssh -X
в машину)? На самом деле мне не нужно генерировать какие-либо графики для монитора. Мне просто нужно правильно импортировать мои модули.
2 ответа
Вам понадобится действительный DISPLAY и XAUTHORITY, чтобы использовать X-программы в Cron!
Чтобы установить DISPLAY очень просто, введите Bash:
export DISPLAY=":0.0"
Чтобы получить действительный XAUTHORITY, вы должны искать его. В Debian/Gnome/gdm3 они сохраняются в var/run/gdm3/*/database. Я использовал следующий скрипт:
export DISPLAY=":0.0"
[ -z $USER ] && USER=$( who | awk '{ print $1 }' | sort | uniq >/tmp/test )
for I in /var/run/gdm3/*; do
AUTHUSER="`echo $I | awk -F '-' '{ print $3 }'`"
for J in $USER; do
[ "${AUTHUSER}" = "${J}" ] || continue
USER="$J"
export XAUTHORITY="${I}/database" && break
done
done
sudo -u ${USER} /Path/to/xProgramm
Var $USER может быть пустым, чем скрипт ищет допустимого пользователя, в противном случае вы можете указать скрипту var!
Вы также можете запустить ваше приложение в фрейм-буфере, используя xvfb
или аналогичный инструмент:
или же sudo apt-get install xvfb
Использование:
xvfb :1 -screen 0 800x600x8 & # WIDTHxHEIGHTxCOLORDEPTH
export DISPLAY=":1"
java application_name.jar
или короче:
xvfb-run -a -e /tmp/some/log/file.log /home/user/application.run
-a
выбирает номер дисплея автоматически, -e file
указывает файл журнала для сообщений об ошибках.