systemd:在前一个服务完成后启动服务

6

我已经安装了Certbot,Certbot会创建一个名为“certbot.service”的systemd服务文件以进行自动证书更新,并通过.timer文件每天启动一次。

在“certbot.service”成功执行后,我想执行第二个服务(“cert-copy-after-certbot.service”),将证书复制到另一个位置。

目前我的设置如下:

“certbot.service”(由Certbot生成):

pi@raspberrypi:/lib/systemd/system $ cat 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

"cert-copy-after-certbot.service":

pi@raspberrypi:/etc/systemd/system $ cat cert-copy-after-certbot.service
[Unit]
Description=crt update after certbot has run
Wants=certbot.service
After=certbot.service

[Service]
Type=simple
ExecStart=/bin/sh -c "cat /etc/letsencrypt/live/<mydomain>/privkey.pem  /etc/letsencrypt/live/<mydomain>/fullchain.pem > /etc/ejabberd/ejabberd.pem"

如果我使用以下命令运行这些文件:

systemctl start <unitname>

两个服务都在运行。

但是当我使用“systemctl start certbot”启动certbot并检查时

systemctl status cert-copy-after-certbot

cert-copy-after-certbot.service 没有运行。

我配置错了吗?


请注意,Certbot现在支持钩子,允许您在成功更新后执行操作,例如将证书部署到其他服务。 - Sean
2个回答

8
我找到了解决方案,以下是答案,以便有相同问题的人参考。
问题在于 "certbot.service" 单元并不知道 "cert-copy-after-certbot.service"。因此,如果调用 "certbot.service",就不会调用未激活的 "cert-copy-after-certbot.service",因为 "Wants=" 没有被执行。
所以,如果你不想修改 "certbot.service" 单元(使用 "Wants=cert-copy-after-certbot.service"),可以按照以下方式操作:在 "cert-copy-after-certbot.service" 中添加一个额外的 [Install] 部分,其中包含一行 "WantedBy=cerbot.service"。这样文件看起来就像这样:
pi@raspberrypi:/etc/systemd/system $ cat cert-copy-after-certbot.service
[Unit]
Description=crt update after certbot has run
After=certbot.service

[Service]
Type=simple
ExecStart=/bin/sh -c "cat /etc/letsencrypt/live/<mydomain>/privkey.pem/etc/letsencrypt/live/<mydomain>/fullchain.pem > /etc/ejabberd/ejabberd.pem"

[Install]
WantedBy=certbot.service

安装部分需要通过systemctl进行启用或禁用调用(或者对于临时测试,使用start或stop命令)。

systemctl enable cert-copy-after-certbot

这个[Install]部分将会在你启用此单元后创建一个符号链接,它会告诉systemd守护进程,如果调用"certbot.service",那么他必须调用"cert-copy-after-certbot.service"。(而"unit"部分中的"After="告诉systemd应该按照哪个顺序调用,否则两个单元将同时运行)


-1
你可能会发现,除非你在 cerbot.service 中也设置了 RemainAfterExit=yes,否则 cert-copy-after-certbot.service 会在 cerbot.service 完成之前启动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接