如何在另一个“简单”类型的 systemd 服务完成后启动一个 systemd 服务

如何在另一个“简单”类型的 systemd 服务完成后启动一个 systemd 服务

我见过类似的问题,但没有一个能解决我面临的情况。我的服务 A 定义如下(注Type=simple)。

[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

仅当服务 A 运行完成后,才需要运行另一项服务 B。我尝试了以下操作,但似乎服务 A 启动后服务 B 就会立即启动。服务 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

服务 A 被标记为 WantedBy 此目标,而服务 B 被标记为RequiredBy 此目标。这意味着,只有达到 service-b.target 时,服务 B 才会启动,而只有服务 A 成功完成后,服务 B 才会达到 service-b.target。

相关内容