Как правильно настроить работу cron root

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

 $ 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 журнала /var/log/tunlr.log ничего не происходит, что означает, что работа не была успешно запущена.

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

 sudo /usr/bin/tunlrupdate.sh 

то соответственно обновляется файл журнала.

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

ОБНОВЛЕНИЕ 1: Все предлагаемые решения пока не работают. Я благодарю Olli за 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 = вставкой и использованием абсолютного пути от root для функций в скрипте или без предложенных здесь решений. Я все еще получаю эту ошибку.

После некоторого поиска я указал на ошибку в файле /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. В файле журнала ничего не записывается. Может быть, даже пустой скрипт не будет работать в cron? Я не понимаю. Я знаю, попробовал сценарий, сведенный к этим двум строкам:

 #!/bin/bash exit 0 

И все тот же журнал ошибок. Сценарий cron не проходит …

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

 crontab -e 

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

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

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

 sudo crontab -e 

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

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

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

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

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

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

Одна «проблема» с 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 

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

Сообщения об ошибках Cron обычно – по умолчанию – отправляются по электронной почте. Вы можете проверить, есть ли электронная почта для root с sudo mail или просто проверка содержимого /var/mail/root , например sudo less /var/mail/root .


Если сообщения электронной почты не помогают, также проверьте /var/log/syslog :

 sudo grep CRON /var/log/syslog 

Как уже сказал Алексис Вильке, cron имеют разные механизмы для настройки переменных окружения.

Требуется сценарий

 PATH=/sbin:/bin:/usr/bin 

к кронтабу. HOME не требуется. Вы должны использовать абсолютные пути в своих сценариях, например /bin/date вместо date . Вы можете найти правильные пути для каждой команды с which command_name , например

 $ which date /bin/date 

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

 /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