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

cha*_*amu 6 systemd certbot

我已经安装了 certbot,并且 certbot 制作了自己的 systemd 服务文件“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
Run Code Online (Sandbox Code Playgroud)

“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"
Run Code Online (Sandbox Code Playgroud)

如果我运行这个文件:

systemctl start <unitname>
Run Code Online (Sandbox Code Playgroud)

两项服务均正常运行。

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

systemctl status cert-copy-after-certbot
Run Code Online (Sandbox Code Playgroud)

cert-copy-after-certbot.service 未运行。

是我配置错误了吗?

cha*_*amu 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
Run Code Online (Sandbox Code Playgroud)

安装部分需要通过 systemctl 进行启用或禁用调用(或者启动或停止以进行临时测试)。

systemctl enable cert-copy-after-certbot
Run Code Online (Sandbox Code Playgroud)

一旦您启用通知 systemd 守护程序的单元,此 [Install] 部分将创建一个符号链接,如果调用“certbot.service”,他必须调用“cert-copy-after-certbot.service”。(单元部分中的“After =”告诉systemd灵魂调用的行,没有它,两个单元将同时运行)