我见过类似的问题,但没有一个能解决我面临的情况。我的服务 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。