我已经安装了带有 nginx 模块的 certbot。今天我注意到自动安装的 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
答案1
从man test
:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 和 EXPRESSION2 都为真
-a
是合乎逻辑的and
!
对以下表达式取反,-d /run/systemd/system
因此,这意味着:
如果/usr/bin/certbot
存在且可执行,并且不/run/systemd/system
存在且是目录。
只是\
一种逃避,所以 crond 不会!
直接解释。
至于为什么会出现这种情况...您必须询问软件包维护人员。如果这种情况可重现,并且安装在您的系统中产生了无法正常工作的结果,则可能需要在他们的错误跟踪器中提出问题。
答案2
那个 cron 作业太荒谬了。它什么都没做,只是失败了,正是因为它安装在 systemd 系统上。该逻辑旨在在 systemd 系统上运行时不执行 certbot,特别是当目录/run/systemd/system
存在时。
它是不是如何在 systemd 系统上运行 certbot renew。你应该使用 systemd 计时器。
cron 作业在使用 upstart 而非 systemd 的旧 Ubuntu 系统上是有意义的。因此,不清楚 Ubuntu 软件包维护者为什么要将其放入当前软件包中。它不是 certbot 的标准组成部分。