Как правильно настроить работу 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

И вставил эти две строки в конце. Я ожидаю, что 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 не работает так, как планировалось в моей системе?

UPDATE 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 не проходит ...

1
задан 4 June 2017 в 14:38

4 ответа

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

crontab -e

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

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

Если вы хотите запустить скрипт как [d1 ] normal user :

sudo crontab -e

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

07,37 * * * * /usr/bin/tunlrupdate.sh
46
ответ дан 24 May 2018 в 11:53
  • 1
    @NineCattoRules Если вы не уроните выход, что вы видите? – Angelo Fuchs 15 May 2017 в 10:47
  • 2
    @AngeloFuchs старый комментарий ... конечно, я пробовал эту команду как root (sudo crontab -e вместо crontab -e). Или что-то еще, так или иначе – NineCattoRules 15 May 2017 в 19:53

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

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

2
ответ дан 24 May 2018 в 11:53
  • 1
    Это единственный ответ, который на самом деле работал для меня. Я скопировал инструкции SHELL и PATH из файла /etc/crontab и вставил их в sudo crontab -e, и команда запускалась как root без проблем. Спасибо! – Terrance 21 April 2017 в 18:23

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

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

sudo grep CRON /var/log/syslog

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

Ваш скрипт необходим [!d5 ]

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

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

$ which date
/bin/date
0
ответ дан 24 May 2018 в 11:53
  • 1
    Запуск предложенного grep CRON в / var / log / syslog Я получил обман 11 февраля 14:37:01 Marius-PC CRON [7826]: (root) CMD (root /usr/bin/tunlrupdate.sh) 11 февраля 14: 37:01 Marius-PC CRON [7825]: (root) MAIL (отправлено 1 байт вывода, но получил статус 0x00ff, # 012) 11 февраля 14:39:01 Marius-PC CRON [7849]: (root) CMD ( [-x / usr / lib / php5 / maxlifetime] & amp; & amp; [-d / var / lib / php5] & amp; & amp; find / var / lib / php5 / -depth -mindepth 1 -maxdepth 1-type f - cmin + $ (/ usr / lib / php5 / maxlifetime)! -execdir fuser -s {} 2 & gt; / dev / null \; -delete) Если добавить некоторую определенность для PATH в cron, это не повлияет на мою систему $ PATH ? – Antonio 12 February 2014 в 02:11
  • 2
    В этом выпуске говорится, что он пытался отправить что-то, но не удалось. Это означает, что вы не получаете это сообщение об ошибке в /var/mail/root. Вы можете либо исправить это, либо попробовать с помощью PATH=... – Olli 12 February 2014 в 02:14
  • 3
    @Antonio, альтернативно, используйте эту исправленную версию – Olli 12 February 2014 в 02:18
  • 4
    Благодарю. Я знаю, что не настраивал системную электронную почту и знал, что не прошел. Я уже модифицировал скрипт для использования абсолютного пути для любой вызываемой функции. Последнее, что было моим предыдущим вопросом, определение PATH внутри crontab не испортит мою переменную $ PATH системы? – Antonio 12 February 2014 в 02:37
  • 5
    В то же время я был занят исправлением ошибки в формате даты из исходного сценария. Он использовал% m (что за месяц NOT минута) вместо% M ... – Antonio 12 February 2014 в 02:40

Вы можете добавить эту строку в свой скрипт. Итак, после того, как вы проверили журналы 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
0
ответ дан 24 May 2018 в 11:53

Другие вопросы по тегам:

Похожие вопросы: