Назад | Перейти на главную страницу

Nginx certbot cronjob не работает

Я установил certbot с модулем nginx. Сегодня заметил, что автоматическая установка cron не работает. Рассматриваемая cronjob

/etc/cron.d/certbot

и содержание было

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

Я отладил скрипт

test -x /usr/bin/certbot
echo $?
0

test -x /usr/bin/certbot -a \! -d /run/systemd/system
echo $?
1

и посмотрел справочную страницу для тестирования. \! не кажется допустимым аргументом для флага -a.

Мне удалось запустить cronjob, используя

0 */12 * * * root test -x /usr/bin/certbot -a -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

У меня вопрос: при чем здесь \! делать и всегда ли это было?

я использую

certbot 0.26.1
nginx version: nginx/1.14.0
Ubuntu 16.04.5

Из man test:

ВЫРАЖЕНИЕ1 -a ВЫРАЖЕНИЕ2
оба EXPRESSION1 и EXPRESSION2 верны

-a логичный and

! отрицает следующее выражение, -d /run/systemd/system

Итак, это означает:

ЕСЛИ /usr/bin/certbot существует и является исполняемым И НЕ /run/systemd/system существует и является каталогом.

В \ это просто побег, поэтому crond не интерпретирует ! прямо.


Относительно того, почему он существует ... вам нужно будет спросить у сопровождающих пакета. Если это воспроизводимо, возможно, стоит поднять проблему в их багтрекере, если установка дает неработающий результат в вашей системе.

Эта работа cron просто смешна. Он ничего не делает, кроме сбоя, именно потому, что он установлен в системе systemd. Логика предназначена для того, чтобы не запускать certbot при запуске в системе systemd, особенно когда каталог /run/systemd/system существуют.

Это не как вы должны запускать обновление certbot в системе systemd. Вы предназначены для использовать таймер systemd.

Задание cron имело бы смысл в старой системе Ubuntu, которая использовала выскочку вместо systemd. Поэтому непонятно, почему разработчики пакетов Ubuntu вообще поместили его в текущий пакет. Это не стандартная часть certbot.