如何在另一个类型为"simple"的systemd服务完成后启动一个systemd服务?

我看过类似的问题,但没有一个涉及到我所面临的情况。我的服务A定义如下(注意)。
[Unit]
Description=Sample service A
Before=shutdown.target
After=multi-user.target
Requires=multi-user.target
Conflicts=shutdown.target

[Service]
Type=simple
RemainAfterExit=yes
Restart=no
ExecStart=/etc/rc.d/init.d/script_a start
ExecStop=/etc/rc.d/init.d/script_a stop

[Install]
RequiredBy=random.target

另一个服务 B 需要在服务 A 完成后才能运行。我尝试了以下方法,但似乎服务 B 在服务 A 启动后立即启动。服务 B 没有等待 A 完成。
[Unit]
Description=Sample service B
After=serviceA.service
Requires=serviceA.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/init.d/scriptb start

[Install]
RequiredBy=random.target

如何让服务B等待直到A完成?

编辑

我还尝试将OnSuccess=serviceB.service放在服务A中,但没有帮助。

1个回答

为了让服务B等待直到服务A完成,您可以在服务A中添加WantedBy选项,并在服务B中添加RequiredBy选项,目标相同。以下是您可以修改单元文件的方法:
对于服务A:
Description=Sample service A
Before=shutdown.target
After=multi-user.target
Requires=multi-user.target
Conflicts=shutdown.target

[Service]
Type=simple
RemainAfterExit=yes
Restart=no
ExecStart=/etc/rc.d/init.d/script_a start
ExecStop=/etc/rc.d/init.d/script_a stop

WantedBy=service-b.target

[Install]
RequiredBy=random.target 

关于B服务:
Description=Sample service B
After=serviceA.service
Requires=serviceA.service

RequiredBy=service-b.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/init.d/scriptb start

[Install]
RequiredBy=service-b.target

Service A 被标记为这个目标的 WantedBy,而 Service B 被标记为这个目标的 RequiredBy。这意味着只有当 service-b.target 被达到时,Service B 才会启动,而 service-b.target 只有在 Service A 成功完成后才能被达到。