Я плохо знаком с 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
. Но все еще никакая удача, выполняющая задание крона.
Что я делаю неправильно?
Для выполнения любого приложения 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. Здесь представлен, как сценарий работает: