Я попытался настроить 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