Как правильно настроить задание root cron

Как правильно настроить задание root cron

Я попытался настроить root cron job для запуска скрипта Bash от имени root, чтобы он запускался в 7,37 минут, каждый час, каждый день месяца, каждый месяц. Этот скрипт находится в /usr/binи называется tunlrupdate.sh. Он обновляет DNS Tunlr.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

Этот скрипт Bash доступенздесь.

При вызове скрипт записывает происходящее в журнал, расположенный в/var/log/tunlr.log

Чтобы добавить это задание root cron, я использовал стандартный файл crontab для root

sudo crontab -e

И вставил эти 2 строки в конец. Я ожидаю, что cron запустит скрипт от имени root.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

Более поздняя команда sudo crontab -lподтвердила, что задание cron было вставлено.

Я перезагрузил Ubuntu и проверял в файле журнала, было ли задание cron запущено должным образом. Однако в файле журнала нет ничего, /var/log/tunlr.logчто означало бы, что задание не было успешно запущено.

Я проверил, если запустить скрипт из командной строки

sudo /usr/bin/tunlrupdate.sh

затем файл журнала обновляется соответствующим образом.

Почему это задание cron не выполняется в моей системе так, как планировалось?

ОБНОВЛЕНИЕ 1: Все предложенные решения пока не работают. Я благодарю Олли за CLI для просмотра системного журнала sudo grep CRON /var/log/syslog. Однако я получил ошибку CRON

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

с предложенной вставкой PATH= и использованием абсолютного пути от корня для функций в скрипте или без этого предложенного здесь решения. Я все еще получаю эту ошибку.

После некоторых поисков я обнаружил ошибку в файле, /usr/lib/php5/maxlifetimeкак описано ниже.здесь:Change #!/bin/sh -e --> #!/bin/sh -x

Затем перечислите журнал ошибок CRON в моей системе

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

Я все еще не могу запустить скрипт bash. На этот раз в журнале не отображается никаких ошибок. Чтобы убедиться, что это не содержимое скрипта, я сократил скрипт до следующих трех строк:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

Я все еще не могу запустить cron job. В файле журнала ничего не написано. Так что, может быть, даже пустой скрипт не будет запускаться в cron? Я не понимаю. Я знаю, что пытаюсь сократить скрипт до этих 2 строк:

#!/bin/bash
exit 0

И все тот же лог ошибок. Скрипт cron не проходит...

решение1

Если вы хотите запустить скрипт какобычный пользователь:

crontab -e

И добавьте строку:

07,37 * * * * /usr/bin/tunlrupdate.sh

Если вы хотите запустить свой скрипт каккорень:

sudo crontab -e

И добавьте ту же строку:

07,37 * * * * /usr/bin/tunlrupdate.sh

решение2

Ну вот, наконец-то рабочее решение. В системном журнале я увидел повторяющееся и интригующее:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

Похоже, root не был распознан как cmd. Поскольку я уже использовал cron root, используя $ sudo /usr/bin/tunlrupdate.sh. Затем я попробовал с оригинальным скриптом (исправлена ​​ошибка в дате UNIX cmd : %m, который является месяцем, использовался для минут, которые являются %M) следующее (что удаляет root из строки cron):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

Это оказалось окончательным решением. [Хотя я нашел множество литературы, в которой указывалась ошибочная строка с root в строке cron. Это была ошибка].

решение3

Одной из «проблем» cron является отсутствие переменных окружения (например,очевидныйсоображения безопасности). Вероятно, у вас отсутствуют PATH и HOME. Вы можете определить их непосредственно в скрипте или в файле crontab.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

Вам придется проводить тестирование до тех пор, пока все необходимые переменные не будут определены так, как того требует сценарий.

решение4

Вы можете добавить эту строку в свой скрипт. Так что после проверки журналов cron и проверки того, что ваша работа была выполнена, вы можете получить тот же $PATH, который был у crontab.

/bin/echo $PATH > /root/path.txt

И, вероятно, лучшее, что вы можете сделать для диагностики проблем в скриптах cron, это получить все переменные окружения SO с помощью команды env в вашем скрипте. Так что просто добавьте эту строку в ваш скрипт. Затем вы можете проанализировать выводallEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

Другой трюк — направить вывод скрипта в какое-то место. Добавление /root/log.log. Таким образом, весь вывод скрипта будет сохранен в/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Также вы можете запланировать запуск скрипта каждую минуту, чтобы облегчить тестирование и проверки.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Связанный контент