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

systemd: start service after the previous one have finished

我已经安装了 certbot,certbot 为自动证书更新创建了自己的系统服务文件 "certbot.service",每天通过 .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

certbot.service 之后的证书副本没有 运行。

我是不是配置有误?

我找到了解决方案,所以如果有人有同样的问题,这里就是答案。

问题是 "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 启用或禁用调用(或启动或停止以进行临时测试)。

systemctl enable cert-copy-after-certbot

这个 [Install] 部分将创建一个符号 link 一旦你启用通知 systemd 守护进程的单元,如果 "certbot.service" 被调用,他必须调用 "cert-copy-after-certbot.service" 来. (并且单元部分中的 "After=" 告诉 systemd 灵魂调用的行,没有它,两个单元将同时 运行)

您可能会发现 cert-copy-after-certbot.servicecerbot.service 完成之前启动,除非您还在 cerbot.service

中设置了 RemainAfterExit=yes