Задание 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 указывает файл журнала для сообщений об ошибках.

Другие вопросы по тегам