systemd :获取目标子作业的状态

systemd :获取目标子作业的状态

结论

如何查看目标上所有服务的状态?

就像是 :

# 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包含所有这些单元作为依赖项的文件。

更完整的上下文如下:

  1. 单位和目标实际上是用户单位和目标单位
  2. service.target文件仅包含描述:

    #cat .config/systemd/user/service.target
    [Unit]
    Description = Service global target
    
  3. 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.targetsystemctm --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 服务来同时停止/启动多个实例?

选项摘要如下:

  1. systemctl status $(systemctl list-dependencies --plain your.target)
  2. 对 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 (正确) 评论道:

  1. 它不是按字母顺序排列的
  2. 开头的命令ConsistsOf=无论如何都需要进行某种形式的剥离,然后才能传递给另一个命令

我看到的好处是:

  1. PartOf它仅列出根据我的目标声明的项目:
    例如当我使用list-dependencieson时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=
    

    显示的是空列表

  2. 我在最初的问题中没有说明,但我们实际上使用了一些额外的参数(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
    
  3. 该单位本身列在list-dependencies,但不在ConsistsOf

所以无论如何我都必须对输出进行一些处理。

只是分享我的经验;感谢您的回答和指示,为我指明了正确的方向。

相关内容