使用 systemd 为服务创建依赖项

使用 systemd 为服务创建依赖项

我正在尝试创建一个在 ServiceA 启动后启动的 ServiceB。

这就是我尝试做的:

服务A文件:

[Unit] 
Description=ServiceA 
After=network.target
 
[Service] 
ExecStartPre=running some shell script.... 
ExecStart=running some shell script....
ExecReload=/bin/kill -HUP $MAINPID 
KillMode=process 
Restart=on-failure
RestartPreventExitStatus=255 
TimeoutStopSec=10
 
[Install] 
WantedBy=multi-user.target

第一个 ServiceB 文件尝试:

[Unit] 
Description=ServiceB 
After=ServiceA.service
Requires=ServiceA.service
    
[Service] 
ExecStart=running some shell script.... 

[Install] 
WantedBy=multi-user.target

第二个 ServiceB 文件尝试:

[Unit] 
Description=ServiceB 
After=ServiceA.service
Requires=ServiceA.service

[Service] 
ExecStart=running some shell script.... 

[Install]
WantedBy=ServiceA.service

第一次尝试有效,但仅限于启动时,但是当我使用 systemctl stop ServiceA systemctl stop ServiceA 停止服务时

然后尝试再次启动 ServiceA systemctl start ServiceA

我认为 ServiceB 也应该启动(它仍然启用)

可能存在什么问题?

** 我不想在 ServiceA 文件中使用 Wants=,我希望 ServiceB 来管理它。

答案1

您忘记告诉在编辑后systemd重新安装新代码。文件没有任何问题,一旦服务正确安装,systemctl start 和 stop 就可以正常工作。使用以下命令告诉 systemd 使用新代码:.wantsServiceB.service.service

sudo systemctl daemon-reload # Or use `systemctl edit` next time, which does this automatically
sudo systemctl disable ServiceB.service # Applies the remove from multi-user.target.wants
sudo systemctl enable ServiceB.service # Actually installs to ServiceA.wants

systemd 不会在启动时自动重新启用服务,而是让您单独执行此操作,这是有原因的。您希望能够禁用服务,这可以通过从 中删除来完成.wants。如果它自动重新创建依赖项,您将无法禁用导致问题的服务。

相关内容