![有没有办法让 systemd 中的一个 app.service 启动多个独立的 app.service 单元?](https://linux22.com/image/1159374/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E8%AE%A9%20systemd%20%E4%B8%AD%E7%9A%84%E4%B8%80%E4%B8%AA%20app.service%20%E5%90%AF%E5%8A%A8%E5%A4%9A%E4%B8%AA%E7%8B%AC%E7%AB%8B%E7%9A%84%20app.service%20%E5%8D%95%E5%85%83%EF%BC%9F.png)
例如,如果我有两个服务文件以type=forking
启动两个不同的 java 应用程序的方式运行,然后有两个服务文件以 type=simple 的方式运行不同的应用程序,那么有没有办法运行另一个服务文件来启动/停止其他四个服务文件,但其他四个仍然可以独立使用?
例如:
dataingest-type1.service
dataingest-type2.service
different-dataingest.type3.service
different-dataingest.type4.service
所有服务均作为 systemd 下的独立服务正常运行。
诸如此类的服务可以dataingest.service
启动/停止其他四个吗?
此外,如果其他服务之一发生故障并且dataingest.service
再次运行,它应该重新启动该服务。(基本上,我尝试制作一个运行的脚本systemctl start <list of services>
并将其设置为服务,但是如果其中一个服务停止并且服务启动再次运行,它不会运行该脚本,因为它认为该服务正在运行。)
因此dataingest.service
看起来像这样:
[Unit]
Description=Stuff blah blah
Requires=network.target
After=network.target
[Service]
Type=oneshot
ExecStart=/path/to/little/script.sh start
ExecStop=/path/to/little/script.sh stop
RemainAfterExit=true
[install]
WantedBy=multi-user.target
bash 脚本只完成一项工作!
#/bin/bash
/bin/systemctl $1 dataingest-type1.service dataingest-type2.service different-dataingest.type3.service different-dataingest.type4.service
显然如果有更好的方法......
答案1
答案2
因此,使用@Mark 提供的链接,我可以确定需要做什么。
主服务 dataingest.service 需要作为一个目标,因此重命名为 dataingest.target dataingest.target 单元具有以下内容:
[Unit]
Description=Data Ingest Services
Requires=network.target
After=network.target
Wants=dataingest-type1.service dataingest-type2.service different-dataingest.type3.service different-dataingest.type4.service
[Install]
WantedBy=multi-user.target
然后各个服务都有类似以下内容的内容:
[Unit]
Description=type x data ingest service
PartOf=dataingest.target
[Service]
Type=......
etc
etc
etc
[Install]
WantedBy=dataingest.target
然后 systemctl enable dataingest..... 然后重新加载。
现在可以单独启动服务,也可以仅使用目标文件启动。sudo systemctl start dataingest.target
此外,如果其中一项服务发生故障,目标单元将启动单独的服务。
谢谢@mark