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.service
在 cerbot.service
完成之前启动,除非您还在 cerbot.service
中设置了 RemainAfterExit=yes
我已经安装了 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.service
在 cerbot.service
完成之前启动,除非您还在 cerbot.service
RemainAfterExit=yes