结论
如何查看目标上所有服务的状态?
就像是 :
# obviously, 'systemctl status' does not have this output :
$ systemctl --user status service.target
service.target: inactive (dead)
├── backend.service: active
├── db.service: active
├── frontend.service: active
└── scheduler.service: inactive (dead)
语境
我们有几个 systemd 单元,它们是更全局服务的一部分,因此我们编写了一个service.target
包含所有这些单元作为依赖项的文件。
更完整的上下文如下:
- 单位和目标实际上是用户单位和目标单位
该
service.target
文件仅包含描述:#cat .config/systemd/user/service.target [Unit] Description = Service global target
service.target
的依赖项在文件系统中列出:$ tree .config/systemd/user ├── backend.service ├── db.service ├── frontend.service ├── scheduler.service ├── service.target └── service.target.requires ├── backend.service -> ../backend.service ├── db.service -> ../db.service ├── frontend.service -> ../frontend.service └── scheduler.service -> ../scheduler.service
通过此设置,systemctl --user start service.target
其systemctm --user stop service.target
工作正如我们预期的那样。
我想要的
我想要一个命令或脚本,它可以告诉我目标的依赖项是否全部启动、仅部分启动还是全部关闭。
据我尝试:
systemctl --user status service.target
会正确地告诉我(并以 退出0
)所有服务是否都已启动,但不会帮助我区分“一些已启动,一些已关闭”和“全部已关闭”(在两种情况下:退出代码为3
,状态消息为inactive (dead)
)systemctl --user list-dependencies service.target
没有提供足够稳定的输出来解析systemctl --user status
将为我提供由 systemd 用户服务启动的所有进程的详细概述,但我不知道如何将此列表缩小到“仅 service.target 下的服务”
问题
获取 systemd 目标所依赖的所有服务的状态最稳定的方法是什么?
我们应该修改我们的设置吗?
答案1
此主题最近在如何创建虚拟 systemd 服务来同时停止/启动多个实例?。
选项摘要如下:
systemctl status $(systemctl list-dependencies --plain your.target)
- 对 systemd 功能请求进行评论,以将其添加为内置功能
答案2
在研究 systemd 时,我发现以下命令可以给我一个我想要检查的服务的更直接的列表:
systemctl --user show --property=ConsistsOf your.target
""
它具有返回基本服务的额外好处:
$ systemctl --user show --property=ConsistsOf service.target
ConsistsOf=backend.service db.service frontend.service scheduler.service
$ systemctl --user show --property=ConsistsOf backend.service
ConsistsOf=
@MarkStosberg (正确) 评论道:
- 它不是按字母顺序排列的
- 开头的命令
ConsistsOf=
无论如何都需要进行某种形式的剥离,然后才能传递给另一个命令
我看到的好处是:
PartOf
它仅列出根据我的目标声明的项目:
例如当我使用list-dependencies
on时db.service
,我看到:$ systemctl --user list-dependencies --plain db.service db.service -.slice basic.target paths.target sockets.target dirmngr.socket gpg-agent-browser.socket gpg-agent-extra.socket gpg-agent-ssh.socket gpg-agent.socket timers.target
(从技术上来说确实如此,但与我的用例无关)而:
$ systemctl --user show --property=ConsistsOf db.service ConsistsOf=
显示的是空列表
我在最初的问题中没有说明,但我们实际上使用了一些额外的参数(
backend.service
实际上可以是[email protected]
或[email protected]
或...)当list-dependencies
在我们的目标上使用时,不知何故,[email protected]
被列出两次:$ systemctl --user list-dependencies --plain service.target service.target [email protected] [email protected] db.service frontend.service scheduler.service
该单位本身列在
list-dependencies
,但不在ConsistsOf
所以无论如何我都必须对输出进行一些处理。
只是分享我的经验;感谢您的回答和指示,为我指明了正确的方向。