Системный таймер / сервис letsencrypt/certbot не работает в Ubuntu 18.04

Я установил certbot для nginx, и скрипт автообновления настраивается автоматически, но это электронное письмо, которое я получаю при каждом запуске:

/home/foobar/certbot-renew.sh: 1: /home/foobar/certbot-renew.sh: /usr/bin/certbot: not found

Меня смущает то, что нет certbot-renew.sh в моем доме реж...?

Дополнительная информация от systemctl:

# /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

а также

# /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true

Я новичок в использовании systemd, помощь приветствуется!

Редактировать:

Как предложил @grawity, я проверил свои crontabs и нашел это:

foo@bar:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

Также это:

foo@bar:~$ cat /etc/cron.d/certbot
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

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

Чтобы уточнить:

foo@bar:~$ which certbot
/usr/bin/certbot

foo@bar:~$ certbot --version
certbot 0.26.1

3 ответа

Certbot имеет свой собственный сервис для обновления, вам не нужно никаких дополнительных строк crontab. Теоретически.

Практически у меня есть семена certbot.timer перестать казаться без всякой причины:

$ sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
   Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
   Active: inactive (dead) since .....; 1 months 7 days ago

В этом случае перезапуск помогает:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Причину, по которой он перестает функционировать, еще предстоит выяснить.

Сервисы Systemd не генерируют почтовые уведомления. Работы Cron делают.

Все это указывает на то, что показанные вами системные модули не связаны с проблемой (возможно, они уже работают без проблем), но ту же задачу выполняют из другого места; скорее всего, работа, определенная в вашем crontab.

использование crontab -l перечислить задания cron для вашей учетной записи пользователя и crontab -e редактировать их.

Обязательно проверьте свой собственный crontab, crontab root (через sudo) и общесистемный /etc/crontab файл (нет специальной команды для этого).

Более старый вопрос, но может помочь другим в отношении cron vs systemd и certbot:

Вы упоминаете, что «скрипт автообновления устанавливается автоматически».
Вы упоминаете «всякий раз, когда он запускается».
Поскольку вы, кажется, знаете, что что-то работает, что работает?
Как вы установили certbot под Ubuntu? АПТ?
certbot-renew.shНЕ устанавливается certbot через APT (или SNAP). Никогда не слышал об этом.

--

Похоже, вы установили certbot через APT, поскольку у вас есть файл /etc/cron.d для certbot.

Сначала нужно понять, что такое/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:

0 */12 * * *= Запускать эту запись каждые 12 часов (12-го часа).
rootэто пользователь для запуска.
используется, чтобы увидеть, если/usr/bin/certbotявляется исполняемым (от root) И НЕ (\!) существует.

Если тестовая команда проходит/верна для обоих элементов, то выполняется следующая команда (perl Sleep). Если perl Sleep выполняется/завершается правильно, то наконец запускается следующая команда (certbot).

В вашем случае он никогда не пройдет проверку systemd:

Команда тестирования завершится неудачно. В вашей системе ЕСТЬ systemd.
Все, что следует за &&НЕ выполняется, поскольку systemd/systemсуществует.
Следовательноperl sleepиcertbotкоманды НИКОГДА не запускаются (через cron).

(Если у вас не было systemd, тоtestпройдет, и Perl Sleep установит случайную задержку в течение следующих 12 часов (43200 секунд), а затем запуститcertbot renew(тихо).

Как было предложено, я бы поискал в СОБСТВЕННОМ crontab (и корневом каталоге) скрипт, который вы, возможно, добавили. Не только общесистемный /etc/crontabВы показываете.

sudo grep -R "certbot-renew.sh" /var/spool/cron/crontabs

Эта команда ^ может найти проблему в вашем случае. (Он ищет все пользовательские crontabs). Если вы его найдете, станьте этим пользователем и отредактируйте файл, как указано (crontab -e) и удалите этот скрипт.

Вы не представили никаких доказательств (а/var/log/letsencrypt/letsencrypt.logнапример, ошибка при обновлении), чтобы показать, что обновление не работает через systemd. Ваши файлы systemd certbot выглядят нормально.

Чтобы узнать, работает ли ваш таймер systemd certbot, используйте это:

systemctl status certbot.timer

Пример вывода, который вы должны увидеть:

      ● certbot.timer - Run certbot twice daily
  Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
  Active: active (waiting) since Thu 2020-12-03 12:28:04 CST; 3 weeks 5 days ago
  Trigger: Tue 2020-12-29 22:19:13 CST; 3h 14min left

Чтобы просмотреть последние записи журнала:

journalctl -u certbot.service(или таймер)

Позвольте systemd сделать это и обновите их. Никаких дополнительных скриптов или заданий cron не требуется.

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