Я установил 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.