systemd:服务A运行完成后如何启动服务B?

systemd:服务A运行完成后如何启动服务B?

我需要模拟 Upstart 的“停止时启动”行为,其中服务 A 运行完成后启动服务 B,但在 systemd 中。我该怎么做?

我在文件的章节中看到了对"After="和子句的引用,但它们似乎导致服务 B 在服务 A 启动后才启动"Before="[Unit]*.service开始再次,我需要等到服务 A运行至完成在开始服务 B 之前。

我编写了一个简单示例来演示该行为。我将*.service文件放入/etc/systemd/system,启用两个服务,然后重新启动。我期望在 的“休眠 2 秒”first.sh之前看到 的“...and we're out” second.sh,但我没有得到该结果,如下所示。

感谢您的指导。

====

这是我的服务文件、它们调用的脚本以及 journalctl 输出。

这是“first.service”:

[Unit]
Description=First of two services

[Service]
ExecStart=/home/steve/play/systemd/oneAfterTheOther/first.sh

[Install]
WantedBy=multi-user.target

这是“first.sh”:

#!/usr/bin/env bash
nsec=10
echo "sleep for ${nsec} seconds"
sleep ${nsec}
echo "...and we're out"

这是“second.service”:

[Unit]
Description=Second of two services
After=first.service

[Service]
ExecStart=/home/steve/play/systemd/oneAfterTheOther/second.sh

[Install]
WantedBy=multi-user.target

这是“second.sh”:

#!/usr/bin/env bash
nsec=2
echo "sleep for ${nsec} seconds"
sleep ${nsec}
echo "...and we're out"

最后,这是 journalctl 的输出:

$ journalctl -u first -u second
-- Logs begin at Tue 2018-09-04 17:50:19 CDT, end at Tue 2018-09-04 17:56:37 CDT
Sep 04 17:50:38 sk-xenial-vm systemd[1]: Started First of two services.
Sep 04 17:50:38 sk-xenial-vm systemd[1]: Started Second of two services.
Sep 04 17:50:40 sk-xenial-vm first.sh[900]: sleep for 10 seconds
Sep 04 17:50:40 sk-xenial-vm second.sh[924]: sleep for 2 seconds
Sep 04 17:50:43 sk-xenial-vm second.sh[924]: ...and we're out
Sep 04 17:50:51 sk-xenial-vm first.sh[900]: ...and we're out

答案1

我找到了我自己的问题的答案。

我读到systemd.service 手册页关于“ Type=”子句,我发现当我将“ Type=oneshot”添加到[Service]我的*.service文件部分时,systemd 会执行我想要的操作。

我希望我可以使用其他Type=设置并获得我喜欢的结果,并且我还希望我可能实际上不需要进行second.service一次拍摄就能得到我想要的;first.service这是我需要看到的完成。但我现在有一条通往成功的道路。

因此,为了记录起见,这里有有效的 *.service 文件和 journalctl 输出来证明这一点。

向前!

====

一、服务:

[Unit]
Description=First of two services

[Service]
ExecStart=/home/steve/play/systemd/oneAfterTheOther/first.sh
Type=oneshot

[Install]
WantedBy=multi-user.target

二、服务:

[Unit]
Description=Second of two services
After=first.service

[Service]
ExecStart=/home/steve/play/systemd/oneAfterTheOther/second.sh
Type=oneshot

[Install]
WantedBy=multi-user.target

Journalctl 输出:

$ journalctl -u first -u second
-- Logs begin at Wed 2018-09-05 11:46:04 CDT, end at Wed 2018-09-05 11:51:54 CDT
Sep 05 11:46:21 sk-xenial-vm systemd[1]: Starting First of two services...
Sep 05 11:46:22 sk-xenial-vm first.sh[868]: sleep for 10 seconds
Sep 05 11:46:32 sk-xenial-vm first.sh[868]: ...and we're out
Sep 05 11:46:32 sk-xenial-vm systemd[1]: Started First of two services.
Sep 05 11:46:32 sk-xenial-vm systemd[1]: Starting Second of two services...
Sep 05 11:46:32 sk-xenial-vm second.sh[1104]: sleep for 2 seconds
Sep 05 11:46:34 sk-xenial-vm second.sh[1104]: ...and we're out
Sep 05 11:46:34 sk-xenial-vm systemd[1]: Started Second of two services.

答案2

你可以使用经典双 & 符号

first.sh && second.sh

在此示例中,仅当执行成功(即没有错误)second.sh时才会执行。first.sh

相关内容