Systemd
systemd : 獲取目標子作業的狀態
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
將所有這些單元作為依賴項的組件。對於更完整的上下文:
- 單位和目標實際上是使用者單位和目標單位
- 該
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 目標所依賴的所有服務狀態的最穩定方法是什麼?
我們應該修改我們的設置嗎?
選項摘要如下:
systemctl status $(systemctl list-dependencies --plain your.target)
- 評論 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 評論(正確):
- 它不是按字母順序排列的
- 開始時無論如何都需要某種形式的
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=
確實顯示一個空列表 2. 我沒有在我原來的問題中說明它,但我們實際上使用了一些額外的參數(
backend.service
實際上可以是backend@p0.service
或backend@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
- 單位本身列於 中
list-dependencies
,但未列於ConsistsOf
所以無論如何我不得不對輸出進行一些處理。
只是分享我的經驗;感謝您的回答和指示,它們為我指明了正確的方向。