我在AWS中的Ubuntu20.04上运行certbot,作为一个快速包安装。我不确定certbot更新是否运行正常。我很感激你能帮我找出最好的办法。
这是一个新的服务器,我打开和关闭它时,我准备它的生产。目前它每天运行8到10个小时。它不经常在午夜运行,我认为这是当cron任务运行的时候。这将是24/7在几天后,一旦我完成配置。
我发现的一件事是这个问题的答案说
你不应该设置任何东西。最近Debian/Ubuntu安装certbot时,应该安装一个systemd计时器和一个cron作业(如果systemd没有活动,cron作业只能运行certbot,所以不能同时运行)。
在我看来,certbot计时器似乎没有运行,如果运行了,它似乎指向/dev/null。由于systemd是活动的,所以我想知道cron作业是否正在运行。
我发现了一个评论,可能是计时器和快照的问题,所以这可能是一个已知的问题。
systemctl列表定时器
计时器似乎没有运行
NEXT LEFT LAST PASSED UNIT ACTIVATES
Wed 2021-03-17 23:44:00 UTC 3h 24min left n/a n/a snap.certbot.renew.timer snap.certbot.renew.serviceCertbot计时器似乎指向/dev/null。这个问题表示不应该是这样的。
> root@aws2:/etc/systemd/system# ls -l | grep certbot
lrwxrwxrwx 1 root root 9 Jan 9 06:38 certbot.timer -> /dev/null我可以在syslog中看到以下内容,但我不知道它意味着什么
Mar 17 16:51:02 aws2 systemd[1]: Started Timer renew for snap application certbot.renew.在syslog中,我可以看到cron作业正在运行,但是没有输出
Mar 16 00:00:01 aws2 CRON[2072]: (root) CMD (test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew)下面是/etc/cron.d/certbot (这大概是certbot安装的结果,我对它的功能有了大致的了解,但我不知道test / perl的功能是什么)
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当我运行整个命令(根、测试、/x等)时,我会得到下面的消息。
Command 'root' not found, but can be installed with: snap install root-framework当我运行这个部分时,我没有输出(注意,为了测试,我已经从certbot中删除了"-q“)。我不知道测试部分在做什么,但是当我运行这个命令时,certbot似乎什么也不做。
> test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot renew注意这不是必要的。系统定时器开始正常工作。
在/etc/cron.day文件夹中,我创建了以下文件夹。我想它会做我想做的事,我会在某个时候查看日志。我仍然对我上面问的问题感兴趣。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/bin/certbot -q renew发布于 2021-10-06 02:53:14
由于您使用的是snap,所以值得一次检查,看看是否有第二个定时器(certbot-更新除外)是由snap实现的,并且确实正确地进行了更新。
在这里,您可以看到,我有两个掩码,以确保正常的certbot.timer被禁用,但是我还安装了一个由snap安装的计时器:
root@pi:/etc/systemd/system # ls -l *certbot*
lrwxrwxrwx 1 root root 9 Oct 6 10:42 certbot.timer -> /dev/null
-rw-r--r-- 1 root root 293 Oct 6 05:26 snap.certbot.renew.timer我可以看到,它每天运行两次,目前正在等待:
root@pi:/etc/systemd/system # systemctl list-units | grep certbot.renew
snap.certbot.renew.timer loaded active waiting Timer renew for snap application certbot.renew
root@pi:/etc/systemd/system # cat snap.certbot.renew.timer [Unit]
# Auto-generated, DO NOT EDIT
Description=Timer renew for snap application certbot.renew
Requires=snap-certbot-1515.mount
After=snap-certbot-1515.mount
X-Snappy=yes
[Timer]
Unit=snap.certbot.renew.service
OnCalendar=*-*-* 07:09
OnCalendar=*-*-* 19:46
[Install]
WantedBy=timers.target别被这个职位愚弄了。它是双重检查,以确保它没有做一些已经由systemd管理的事情:
# grep test /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返回一个'1‘代码,因此在&&不执行之后的任何内容。
您的解决方法不会引起问题-但是库存安装应该做正确的事情。
因此,回答你的三个问题:
有什么想法吗? systemd计时器是怎么回事,它为什么指向/dev/null?还是我应该忽略这个已知的问题?
这是反复检查是否使用了snap计时器,而certbot的任何系统计时器(例如,通过apt安装时)都不是。
我应该像Ubuntu所建议的那样“快速安装根框架”来安装"root“吗?
存储在/etc/cron.d中的Cron文件的语法包括执行时要使用的用户名。这里的root表示cron作业是作为根用户运行的。您不需要安装根框架-单词“root”不是命令本身的一部分。
“根测试”这个任务似乎什么都没做.有没有人解释那里正在测试什么,以及"cerbot更新“是否真的在运行?
如前所述--这个职位在有效地说:“嘿,systemd在运行!我什么也不做!”
最后,您可以在日志文件中验证更新的状态:
# grep -c skipped /var/log/letsencrypt/letsencrypt.log
14在我的例子中,还没有更新(有效期足够长),但它正在运行-只是非常安静。
发布于 2021-03-18 00:36:32
关于:
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没有找到命令根目录,因为在命令中包含了用户root。cron作业文件中的格式为min, hr, day, month, day of week, user, command。如果您想运行它进行测试,只需从命令前面移除用户名即可。
Cron作业通常在设定的时间运行,如果服务器在这段时间内关闭,则作业将不会在稍后运行以弥补缺少它的不足。只有当“警报”再次命中服务器时,它才会运行。
有一个解决方案,cron支持运行时的昵称,其中之一是@reboot。Crontab(5)手册
我要做的是设置两个cron作业,一个按计划运行,比如每周一次或每月一次,经销商的选择。然后在@reboot运行第二个任务,以弥补服务器关闭时遗漏的任何内容。当然,如果服务器始终处于关闭状态,这可能意味着它每天都在运行。不管certbot不关心,更新程序会检查您的证书离到期有多近,如果它们未接近到期,它将不会与certbot服务器联系。
除非你需要计时器然后无视这个解决方案..。
保留/etc/cron.d/certbot,但可能改为每周一次,而不是每12小时。
# This would run every Sunday at 01:01
1 1 * * 0 root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew并添加到/etc/crontab中
#This would run every time the server is booted.
@reboot root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew我不知道“快照包”,也不知道为什么需要这些额外的命令行内容。Certbot在一般情况下只需要这个就行了。
@reboot root /usr/bin/certbot renew > /dev/null 2>&1如果您只希望certbot每周检查一次更新,假设服务器始终处于联机状态,并且不需要certbot与任何控制面板或更新操作一起工作,那么最简单的方法是
内部/etc/crontab添加
1 1 * * 0 root /usr/bin/certbot renew > /dev/null 2>&1https://serverfault.com/questions/1057412
复制相似问题