Задание Cron для запуска скрипта python при перезагрузке не работает

Узнайте больше о новой видеокарте и наслаждайтесь ею: BinaryDriverHowto / Nvidia

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

3 ответа

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

В этом ответе предоставляется надежный подход, как найти и экспортировать значение $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 заданиях Cron, и я не могу понять причина. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate.

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

Я создал небольшой проект, названный этим , посвященным этому. Он работает, но не проверен для всех случаев пользователя (например, текущий). Здесь я извлек существенную часть, относящуюся к Mate 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
Это условие работает во всех других случаях, но оно не срабатывает в @reboot заданиях Cron, и я не могу понять причину. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate.

1. Теперь в crontab используйте: [!d20 ]

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

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

Этот скрипт не работает с root crontab. Из-за переменных $UID и $USER. Вы можете заменить их с UID определенного пользователя и NAME. Для других DE изменений mate-session из этой части $(pgrep mate-session -n -U $UID) с именем процесса другого DE, например gnome-session. Возможно, для графических приложений, которые выполняются при запуске системы, лучше создать запись в Startup Applications. Для Mate DE: Control Centre > Personal > Startup Applications (источник).

3. Здесь показано, как работает скрипт:

Он работает

4
ответ дан 22 May 2018 в 16:59

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

В этом ответе предоставляется надежный подход, как найти и экспортировать значение $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 заданиях Cron, и я не могу понять причина. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate.

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

Я создал небольшой проект, названный этим , посвященным этому. Он работает, но не проверен для всех случаев пользователя (например, текущий). Здесь я извлек существенную часть, относящуюся к Mate 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 Это условие работает во всех других случаях, но оно не срабатывает в @reboot заданиях Cron, и я не могу понять причину. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate.

1. Теперь в crontab используйте:

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

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

Этот скрипт не работает с root crontab. Из-за переменных $UID и $USER. Вы можете заменить их с UID определенного пользователя и NAME. Для других DE изменений mate-session из этой части $(pgrep mate-session -n -U $UID) с именем процесса другого DE, например gnome-session. Возможно, для графических приложений, которые выполняются при запуске системы, лучше создать запись в Startup Applications. Для Mate DE: Control Centre > Personal > Startup Applications (источник).

3. Здесь показано, как работает скрипт:

Он работает

4
ответ дан 18 July 2018 в 04:17

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

В этом ответе предоставляется надежный подход, как найти и экспортировать значение $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 заданиях Cron, и я не могу понять причина. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate.

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

Я создал небольшой проект, названный этим , посвященным этому. Он работает, но не проверен для всех случаев пользователя (например, текущий). Здесь я извлек существенную часть, относящуюся к Mate 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 Это условие работает во всех других случаях, но оно не срабатывает в @reboot заданиях Cron, и я не могу понять причину. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate.

1. Теперь в crontab используйте:

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

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

Этот скрипт не работает с root crontab. Из-за переменных $UID и $USER. Вы можете заменить их с UID определенного пользователя и NAME. Для других DE изменений mate-session из этой части $(pgrep mate-session -n -U $UID) с именем процесса другого DE, например gnome-session. Возможно, для графических приложений, которые выполняются при запуске системы, лучше создать запись в Startup Applications. Для Mate DE: Control Centre > Personal > Startup Applications (источник).

3. Здесь показано, как работает скрипт:

Он работает

4
ответ дан 24 July 2018 в 18:03

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

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