有没有办法让 systemd 中的一个 app.service 启动多个独立的 app.service 单元?

有没有办法让 systemd 中的一个 app.service 启动多个独立的 app.service 单元?

例如,如果我有两个服务文件以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

欢迎来到 Ask Ubuntu。

这是systemd.targets

StackExchange 网络中已经有了此问题的答案如何创建虚拟 systemd 服务来同时停止/启动多个实例?

答案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

相关内容