Crontab выполняется несколько команд, но последняя команда опущена

Я знаю, как выполнять несколько команд в одной строке 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'

Любые идеи?

0
задан 14 July 2017 в 14:19

2 ответа

Каталог /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.

2
ответ дан 18 July 2018 в 10:18

Каталог /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.

2
ответ дан 24 July 2018 в 19:32

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

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