Задание крона для запущения скрипта Python в перезагрузке не работает

Я плохо знаком с Linux, и я прочитал и следовал многим инструкциям для запущения скрипта Python в перезагрузке, но не их работал:

это - команда, которую я хочу выполнить:

/usr/bin/python3 /home/am/projects/AMAcc/map.py

Я использовал crontab -e и добавил

@reboot /usr/bin/python3 /home/am/projects/AMAcc/map.py

Я попробовал sudo crontab -e и добавил ту же команду

Я даже отредактировал /etc/crontab файл и добавил выше команды.

Испытанное добавление #!/usr/bin/python3 наверху моего кода Python и изменения его полномочий как: sudo chmod a+x map.py

Поскольку документы предположили, что все пользователи смогут выполнить задания крона если cron.deny файл существует, но его пустое, таким образом, я пытался создать пустой cron.deny файлы в обоих /etc/cron.deny и /usr/lib/cron/cron.deny. Но все еще никакая удача, выполняющая задание крона.

Что я делаю неправильно?

4
задан 30 October 2017 в 13:50

1 ответ

Для выполнения любого приложения GUI от Крона, необходимо экспортировать немного переменных настольной среды. В большинстве случаев достаточно экспортировать ток $DISPLAY значение. Я предложил бы, чтобы Вы создали дополнительный запуск (удар) сценарий, который запустит Ваше приложение.

В этом ответе обеспечивается устойчивый подход, как найти и экспортировать текущего пользователя $DISPLAY значение. Но существует проблема. В то время как пользователь не зарегистрирован в DE $DISPLAY значение не установлено. Sо мы могли добавить дополнительное условие, как оно сделан в этом, отвечает:

# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
        export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
  • Это условие работает во всех других случаях, но оно перестало работать в @reboot Задания крона и я не можем выяснить причину. Так, в рамках сценария ниже используется другой подход к проверке, зарегистрирован ли пользователь Помощник.

Для некоторых приложений нужно, и еще немного переменных (например, видят это, и это отвечает), как $DBUS_SESSION_BUS_ADDRESS и $DESKTOP_SESSION. По-моему, лучший подход должен найти настольный процесс сессии текущего пользователя в рамках каталога /proc (обработайте информационную псевдофайловую систему), и экспорт все переменные из файла environ это внутри /proc/process-number.

Я создал маленький проект, названный cron-gui-launcher, выделенным этому. Это работает, но это не тестируется на случаи всего пользователя (как ток). Здесь я извлек основную часть, которая относится для Спаривания DE и сделала модификацию упомянутой выше.

1. Создайте исполняемый файл с этим содержанием:

#!/bin/bash -e

# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
        sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done

# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`

# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
        echo "$EnvVar" >> /tmp/mate-cron.log
        export "$EnvVar"
done

# Execute the list of the input commands
nohup "${1}" >/dev/null 2>&1 &

exit 0

2. Теперь в crontab использование:

@reboot /path-to-the/script "your-application"

3.Примечания:

  • Этот сценарий не должен работать с корнем crontab. Из-за переменных $UID и $USER. Вы могли заменить их остроумие UID определенного пользователя и ИМЯ.

  • Для другого изменения DE mate-session от этой части $(pgrep mate-session -n -U $UID) с названием процесса другого DE, например gnome-session.

  • Возможно, для приложений GUI, которые выполняются в рамках системного запуска, это - лучшая идея создать запись в рамках Приложений Запуска. Для Помощника DE: Control Centre > Personal > Startup Applications (источник).

4. Здесь представлен, как сценарий работает:

enter image description here

5
ответ дан 1 December 2019 в 09:30

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

Похожие вопросы: