我为 nginx 安装了 certbot,并且自动更新脚本会自动设置,但每当它运行时我都会收到以下电子邮件:
/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
答案1
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
其停止运转的原因尚未找到。
答案2
Systemd 服务不会生成电子邮件通知。Cron 作业会生成。
所有这些都表明您显示的 systemd 单元与问题无关(它们可能已经正常工作)——但相同的任务正在从其他地点;很可能是在你的定时任务。
用于crontab -l
列出您的用户帐户的 cron 作业并crontab -e
编辑它们。
确保检查你自己的 crontab、root 的 crontab(通过 sudo),和系统范围的/etc/crontab
文件(没有特殊命令)。
答案3
比较老的问题,但可能会帮助其他人关于 cron vs systemd 和 certbot 的问题:
您提到“自动更新脚本会自动设置”。
您提到“只要它运行”。
既然您似乎知道有东西在运行,那么运行的是什么?
您是如何在 Ubuntu 下安装 certbot 的?APT?
certbot-renew.sh
不是由 certbot 通过 APT(或 SNAP)安装的。从未听说过。
--
看起来您通过 APT 安装了 certbot,因为您有一个用于 certbot 的 /etc/cron.d 文件。
您首先需要了解实际在/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
是以何种用户身份运行。
test
用于查看是否/usr/bin/certbot
可执行(由 root 用户执行)和 systemd/system
做不是(\!) 存在。
如果测试命令通过/两项都为真,则执行下一个命令 (perl sleep)。如果 perl sleep 正确执行/退出,则最终运行下一个命令 (certbot)。
就你的情况而言,它永远无法通过 systemd 检查:
测试命令将失败。您的系统确实有 systemd。
由于存在,因此之后的所有内容&&
均不会被执行systemd/system
。
因此,perl sleep
和certbot
命令永远不会运行(通过 cron)。
(如果您没有 systemd,那么test
将会通过,并且 perl sleep 会在接下来的 12 小时内(43200 秒)设置随机延迟,然后运行certbot renew
(安静地)。
根据建议,我会在您自己的 crontab(和 root)中搜索您可能添加的脚本。不只是你展示的系统范围/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 作业。