Systemd

systemd : 獲取目標子作業的狀態

  • July 27, 2018

TLDR

如何查看目標上所有服務的狀態?

就像是 :

# 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
  1. 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. systemctl status $(systemctl list-dependencies --plain your.target)
  2. 評論 systemd 功能請求以將其添加為內置功能

在探索 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實際上可以是backend@p0.servicebackend@p1.service或……)當list-dependencies在我們的目標上使用時,不知何故,backend@p0.service被列出兩次:

$ systemctl --user list-dependencies --plain service.target
service.target
 backend@p0.service
 backend@p0.service
 db.service
 frontend.service
 scheduler.service
  1. 單位本身列於 中list-dependencies,但未列於ConsistsOf

所以無論如何我不得不對輸出進行一些處理。

只是分享我的經驗;感謝您的回答和指示,它們為我指明了正確的方向。

引用自:https://serverfault.com/questions/922834