Я попытался настроить задание 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 не проходит ...
Если вы хотите запустить скрипт как обычный пользователь:
crontab -e
И добавьте строку:
07,37 * * * * /usr/bin/tunlrupdate.sh
Если вы хотите запустить скрипт как [d1 ] normal user :
sudo crontab -e
И добавьте ту же строку:
07,37 * * * * /usr/bin/tunlrupdate.sh
Одна «проблема» с 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 имеют разные механизмы для настройки переменных среды.
Ваш скрипт необходим [!d5 ]
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