Если ваш скрипт запускается из командной строки, а не из cron
, есть два обычных подозреваемых:
cron
отличается от вашего пути в качестве «обычного» пользователя. Вы можете решить эту проблему, используя спецификацию полного пути для вашего скрипта :@reboot python3 /full/path/to/myscript.py
cron
не знает о состоянии каких-либо служб при запуске. Для cron
@reboot
означает, когда запускается cron
, а не когда сеть работает или какие-либо другие службы, которые могут потребоваться для вашего задания cron
. Один из способов позаботиться об этом — sleep
немного перед запуском скрипта:@reboot (sleep 30; python3 /full/path/to/myscript.py)
Это задержит выполнение вашего скрипта на 30 секунд. Ничего волшебного в 30 секундах... это зависит от вашей системы. Вы можете провести несколько проб и ошибок, чтобы найти надежное время сна.
Обратите внимание, что другим подходом, позволяющим избежать недостатков cron
в отношении состояния системных служб, является использование systemd
. Некоторые (, в том числе и я, )находят cron
более простым в использовании, но, безусловно, systemd
имеет некоторые преимущества.
Наконец, обычно рекомендуется собирать все сообщения об ошибках, сгенерированные при запуске скрипта. Еще одно дополнение к единственной строке в вашем crontab
сделает это:
@reboot (sleep 30; python3 /full/path/to/myscript.py >> /home/yours/cronjoblog) 2>&1
Любые сообщения об ошибках из stderr
будут добавляться к указанному вами файлу.
Это называется продолжением и использует \
как самый последний символ в каждой строке, кроме последней:
#!/bin/sh
sh../jboss/bin/standalone.sh \
--server-config=standalone-full.xml \
-Djboss.node.name=node1 \
-b 0.0.0.0 \
-bmanagement 0.0.0.0
(выровнены для косметических целей, они не обязательно должны быть ).
Подробнее об этом см. Синтаксис оболочки :Как правильно использовать \ для разрыва строк? и связанные вопросы.
Работа над идеей Пола _Комментарий Педанта, в Bash/ksh/zsh можно использовать массив:
#!/bin/bash
args=(
--server-config=standalone-full.xml
-Djboss.node.name=node1
-b 0.0.0.0
-bmanagement 0.0.0.0
)
sh../jboss/bin/standalone.sh "${args[@]}"
Здесь круглые скобки предоставляют синтаксическую подсказку, которую должна знать оболочка, когда заканчивается назначение массива. К сожалению, это работает только с назначением массива, а не только с одной командой.
Кроме того, если сценарий jboss правильно настроен с разрешениями на выполнение и хэш-бангом в сценарии, вы сможете запустить его просто как ../standalone.sh
без явного sh
впереди.