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

20

Я попытался настроить задание 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 ничего не говорится о том, что задание никогда не запускалось успешно.

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

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 = вставкой & amp; использование абсолютного пути от корня для функций в скрипте или без предложенных здесь решений. Я все еще получаю эту ошибку.

После некоторого поиска я определил ошибку в файле /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 не проходит ...

    
задан Antonio 11.02.2014 в 19:01
источник

5 ответов

6

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

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

Похоже, что root не был распознан как cmd. Поскольку я уже использовал cron root, используя $ 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. Это была ошибка].

    
ответ дан Antonio 12.02.2014 в 02:12
источник
44

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

crontab -e

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

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

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

sudo crontab -e

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

07,37 * * * * /usr/bin/tunlrupdate.sh
    
ответ дан Guillaume 26.09.2014 в 14:01
2

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

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

    
ответ дан Alexis Wilke 11.02.2014 в 19:47
0

Сообщения об ошибках 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
    
ответ дан Olli 11.02.2014 в 20:09
0

Вы можете добавить эту строку в свой скрипт. Итак, после того, как вы проверили журналы 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
    
ответ дан Cassio Seffrin 01.06.2015 в 03:54