Я попытался настроить задание root cron для запуска скрипта 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. На этот раз ошибка не отображается в журнале. Чтобы получить уверенность, что это не было содержанием сценария, я сократил сценарий до следующих 3 строк:
#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE
Я до сих пор не справляюсь с работой cron. Ничего не написано в файле журнала. Так может даже пустой скрипт не запустится в cron? Я не понимаю Я знаю, пытаясь сценарий сводится к этим 2 строкам:
#!/bin/bash
exit 0
И все тот же журнал ошибок. Сценарий cron не проходит ...
Ответы:
Если вы хотите запустить скрипт как обычный пользователь :
И добавьте строку:
Если вы хотите запустить свой скрипт от имени пользователя root :
И добавьте ту же строку:
источник
sudo crontab -e
вместоcrontab -e
). Или что-то еще, в любом случае это работаетНу наконец то рабочее решение. В системном журнале я видел повторяющиеся и интригующие:
Похоже, что root не был распознан как cmd. Как я уже использовал cron рута с помощью
$ sudo /usr/bin/tunlrupdate.sh
. Затем я попытался с оригинальным сценарием (исправленным для ошибки в дате UNIX cmd:% m, который является месяцем, использованным для минут, который является% M), следующее (которое удаляет корень из строки cron):Это оказалось окончательным решением. [Хотя я нашел множество литературных источников, в которых указана ошибочная строка с корнем в строке cron. Это была ошибка].
источник
crontab
команды (кроме файлов crontab в/etc
)./etc/crontab
(общесистемный crontab). Используяsudo crontab -e
вы работаете с crontab root, который обычно можно найти в/var/spool/cron/crontabs
Одна из «проблем» cron - отсутствие переменных окружения (по понятным причинам безопасности). Возможно, вам не хватает PATH и HOME. Вы можете определить их в скрипте напрямую или в файле crontab.
Вам придется тестировать, пока все необходимые переменные не будут определены в соответствии с требованиями сценария.
источник
/etc/crontab
файла операторы SHELL и PATH и вставил их в команду,sudo crontab -e
и команда без проблем запустилась с правами root. Спасибо!Сообщения об ошибках Cron обычно - по умолчанию - отправляются по электронной почте. Вы можете проверить, есть ли электронная почта для пользователя root
sudo mail
, или просто проверить содержимое/var/mail/root
, напримерsudo less /var/mail/root
.Если сообщения электронной почты не помогают, также проверьте
/var/log/syslog
:Как уже сказал Алексис Вилке, у cron есть другой механизм установки переменных окружения.
Ваш сценарий нуждается
в хронтаб.
HOME
не должно быть необходимым. Вы должны использовать абсолютные пути в ваших скриптах, например,/bin/date
вместоdate
. Вы можете найти правильные пути для каждой командыwhich command_name
, например,источник
/var/mail/root
. Вы можете либо исправить это, либо попробоватьPATH=...
Вы можете добавить эту строку в свой скрипт. Таким образом, после того, как вы проверите журналы cron и подтвердите, что ваша работа была выполнена, вы можете получить тот же $ PATH crontabs.
И, вероятно, лучшее, что вы можете сделать для диагностики проблем в скриптах cron - это получить все переменные окружения SO с помощью команды env в вашем скрипте. Так что просто добавьте эту строку в ваш скрипт. Затем вы можете проанализировать вывод
allEvnVars.txt
Другой трюк - направить вывод сценария в какое-то место. Добавление
/root/log.log
. Таким образом, весь вывод скрипта будет сохранен в/root/log.log
Также вы можете запланировать запуск скрипта каждую минуту, чтобы облегчить тесты и проверки.
источник