Я знаю, как выполнять несколько команд в одной строке crontab, но я не могу понять, почему моя последняя команда не выполняется. Мой (корневой) crontab похож на
5 0 1,15 * * echo $(date) >> /root/certbot_cronjob_log.txt && /usr/services/certbot/certbot-auto renew --text >>/root/certbot_cronjob_log.txt 2>&1 && service nginx restart
То, что я хочу достичь: Напишите текущую дату в файл certbot_cronjob_log.txt, затем запустите скрипт autorenew «certbot-auto», напишите его вывод в файл а затем перезапустите nginx.
Он делает все до тех пор, пока не будет «перезапустить nginx». Когда я выполняю именно эту команду в моем терминале (от имени root), он работает, и nginx перезагружается.
Я уже пробовал это:
5 0 1,15 * * bash -c 'echo $(date) >> /root/certbot_cronjob_log.txt && /usr/services/certbot/certbot-auto renew --text >>/root/certbot_cronjob_log.txt 2>&1 && service nginx restart'
Любые идеи?
Каталог /usr/sbin (где находится команда upstart service) не находится в пути crontab по умолчанию, поэтому вам нужно будет добавить явное назначение PATH в верхней части вашего файла crontab, например: [ ! d0] PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
или использовать полный путь в вашей команде
/usr/sbin/service nginx restart
Вам нужно будет сделать это, сохраните ли вы его как встроенную команду или выпустите ее в оболочку скрипт (хотя тогда у вас будет выбор установки PATH в скрипте и в файле crontab).
FWIW, так как часто задаются варианты этого вопроса, вот среда по умолчанию cron на моей системе 16.04, полученная при запуске /usr/bin/printenv > /tmp/cronenv из crontab root:
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
Обратите внимание, насколько это минимально - часто бывает, что команды или скрипты, которые отлично работают в интерактивной оболочке сбой при запуске cron.
Каталог /usr/sbin (где находится команда upstart service) не находится в пути crontab по умолчанию, поэтому вам нужно будет добавить явное назначение PATH в верхней части вашего файла crontab, например: [ ! d0] PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
или использовать полный путь в вашей команде
/usr/sbin/service nginx restart
Вам нужно будет сделать это, сохраните ли вы его как встроенную команду или выпустите ее в оболочку скрипт (хотя тогда у вас будет выбор установки PATH в скрипте и в файле crontab).
FWIW, так как часто задаются варианты этого вопроса, вот среда по умолчанию cron на моей системе 16.04, полученная при запуске /usr/bin/printenv > /tmp/cronenv из crontab root:
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
Обратите внимание, насколько это минимально - часто бывает, что команды или скрипты, которые отлично работают в интерактивной оболочке сбой при запуске cron.