![systemd 仅在服务 A 完成后才启动服务 B](https://linux22.com/image/159428/systemd%20%E4%BB%85%E5%9C%A8%E6%9C%8D%E5%8A%A1%20A%20%E5%AE%8C%E6%88%90%E5%90%8E%E6%89%8D%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%20B.png)
我已经搜索了一两个小时,但似乎找不到正确的解决方案。情况是这样的:
我有多项服务。我启动服务 A,它运行一个 Docker 容器。该应用程序启动,然后将文件写入isActive
文件系统中的已安装目录。
我有一个服务和路径单元文件 B. watch.path 等待直到isActive
存在,它运行 watch.service 并且该服务文件只是回显“isActive
存在!”。
这部分逻辑工作得很好。我使用sudo journalctl -xefb
并观察服务 A 启动,完成其注册,然后写入文件。然后我可以看到服务 B 单元文件开始、回显和完成。
然后我有多个其他服务文件(服务 C/D/E/F)Require
以及After
服务 B 观看服务。然而,服务 C/D/E/F 在服务 B 开始/结束之前就开始了。
这是我当前的“观看”服务:
# watch_for_client.path
[Unit]
Wants=A.service
After=A.service
[Path]
PathExists=/A/B/C/d.txt
[Install]
WantedBy=multi-user.target
# watch_for_client.service
[Unit]
After=A.service
[Service]
Type=oneshot
ExecStart=/bin/echo "file found"
然后在其他文件中,我有
[Unit]
Requires=wait_for_client.service
After=wait_for_client.service
[Service]
...
Type=simple
...
[Install]
WantedBy=multi-user.target
答案1
您需要更改服务 C/D/E/F 的服务单元文件配置中的三项内容:
- 在 [Unit] 部分:删除该行
Requires=wait_for_client.service
- 在 [Unit] 部分中:其中的名称不正确,
After=wait_for_client.service
应该After=watch_for_client.service
与服务 B 名称相匹配 - 在{安装]部分:应该是
WantedBy=watch_for_client.service