Системный таймер / сервис 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 не требуется.