我正在尝试将单个 systemd 服务/程序重构为多个程序和服务。我的单一大型服务如下:
[Unit]
Description=Runs the App loop
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/mainLoop
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure
[Install]
WantedBy=multi-user.target
我从其他例子中拼凑了这个。我现在想要的是两个服务:
服务A
[Unit]
Description=Initializes some things
After=network-online.target # Question 1
[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/startup
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure # Question 2
[Install]
WantedBy=multi-user.target
服务B
[Unit]
Description=Runs the App loop
After=network-online.target # Question 3
[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/mainLoop
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure
[Install]
WantedBy=multi-user.target # Question 4
所以我这里有多个问题点(由上面的评论引用):
- 我不需要网络再为此活动。我应该在这里放什么?如何浏览可能的目标?
- 我希望启动应用程序在启动时只运行一次,不再运行。我想我需要将
Restart
标志更改为其他内容,但是什么? - 当然,我希望它在服务 A 完成后运行,并且仅当它设法以 0 退出并写入文件时才运行,而不是在网络之后运行。一次性服务A启动成功后如何让它启动?
- 我猜更多的是3。我仍然模糊
WantedBy
目标和目标之间的区别After
。基本上是WantedBy
它所属的组,以及After
它之后必须序列化的组吗?
答案1
- 目标取决于操作系统,您未在此处列出。大概
default.target
。您可以通过查看输出来查看目标和用途systemctl list-dependencies
- 只需完全删除“重新启动”即可
- 初始服务应该是
Type=oneshot
.该服务将根据是否写入您需要的文件来正确退出。您可能想使用ExecStartPre
启动初始化脚本来代替。 WantedBy
告诉systemd
在进入给定目标时启动服务。After
表示在给定目标(或单元)中的所有单元完成后启动该单元。