Nginx certbot cronjob 不工作

Nginx certbot cronjob 不工作

我已经安装了带有 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 的标准组成部分。

相关内容