Systemd - 当计时器触发另一个一次性服务时,如何自动重新加载一个单元?

Systemd - 当计时器触发另一个一次性服务时,如何自动重新加载一个单元?

我有两个单元,nginx.service 和 certbot.service,由各自的 Debian 包提供:

nginx.服务:

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

certbot.服务:

[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

还有一个计时器,certbot.timer(也是由 certbot deb 包提供):

[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

这些都运行良好。

问题是,当计时器触发时,我需要重新加载 nginx 以便 nginx 查看新证书(systemctl reload nginx)。

我知道我可以做到systemctl edit certbot.service,并补充:

[Service]
ExecStartPost=/bin/systemctl reload nginx

事实上,这就是我所做的,但这只是个临时解决方案。有没有办法使用本机 systemd 依赖项来实现这一点?棘手的是仅触发重新加载,而不是完全重启。

答案1

您可以直接在 中将部署钩子(不是发布钩子;只有在部署了证书后才需要这样做)添加到您域的 certbot 配置中/etc/letsencrypt/renewal/example.com.conf

在该[renewal]部分中,添加如下行:

deploy_hook = systemctl reload nginx

就这些。您不需要对 systemd 单元进行任何奇怪的操作。

相关内容