我有一堆服务(比如S1, S2,... S10
),它们只能在关键服务 C1 初始化后启动。 C1 写入一个文件(例如/var/run/critical.init
),表明它已完成初始化。此时,每个服务都S1..S10
应该由 systemd 启动。
在尝试实现上述内容时,我使用了.path
基于 systemd 的激活并创建了两个文件:一个用于 的S1
.path 文件:
$ cat s1.path
[Path]
PathExists=/var/run/critical.init
Unit=s1.service
[Install]
WantedBy=multi-user.target
$ systemctl enable s1.path
以及描述服务本身的文件:
$ cat s1.service
[Unit]
Description=Some service
After=syslog.target
[Service]
ExecStart=/usr/bin/s1
Type=simple
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
重新启动后,我验证systemctl status s1
显示该设备处于活动状态并且S1
并且不是列在输出中ps -ef
(如预期)。在我/var/run/critical.init
手动创建文件后不久,systemd 就会启动该单元s1
。
上述实验向我证实,基于路径的激活适用于一个单元。我现在想将其扩展到所有服务S1...S10
。
最明显的方法是为每个服务编写一个.path
文件,但我正在寻找一种更优雅的解决方案。
使用 systemd 可以解决这个问题吗target
?如果每个服务S1...S10
都是 new 的一部分critical.target
而不是 的一部分multi-user.target
,我可以将 的依赖关系设置为/var/log/critical.init
在 中的任何单元critical.target
被触发之前就存在吗?也欢迎任何其他建议。