如何使用 systemctl 列出 Linux 服務

已發表: 2022-10-23
顯示 bash 提示符的 Linux 筆記本電腦
fatmawati achmad zaenuri/Shutterstock.com
要使用 systemd 查看 Linux 系統上所有正在運行的服務,請使用命令“systemctl --type=service --state=running”。 這將顯示每個活動服務的名稱、負載、子狀態和描述。 您還可以更改狀態值以查看已死、已退出、失敗或不活動的服務。

您的 Linux 計算機依賴於許多稱為服務或守護程序的後台任務。 在基於 systemd 的發行版上,您有內置命令,可讓您查看哪些服務正在運行、禁用或失敗。

服務和守護進程

服務和守護程序是在沒有用戶界面的情況下運行的後台任務,不需要人工交互,並且通常在計算機啟動時啟動。

有一次,服務由init ,這是第一個啟動的進程。 服務的詳細信息保存在“/etc/init/d”目錄中的一組腳本中。 在非系統發行版上仍然如此。

在 systemd 世界中,服務由systemd啟動,這是現在要啟動的第一個進程。 服務的詳細信息存儲在“/usr/lib/systemd”目錄中的單元文件中。

根據其手冊頁, systemd是一個系統和服務管理器。 您可以使用systemctl命令來檢查和控制 systemd 系統的不同方面,包括服務和守護進程。

因為我們在這裡查看特定於 systemd 的命令,所以您需要知道的第一件事是您是否正在運行基於 systemd 的發行版。

相關:為什麼 Linux 的 systemd 在這麼多年之後仍然存在分歧

init 還是基於systemd?

絕大多數 Linux 發行版都使用 systemd,包括 Arch、Red Hat 和 Debian,以及許多衍生自它們的發行版。 這包括 Ubuntu 系列發行版、Fedora 及其自旋,以及 Manjaro 和其他基於 Arch 的發行版。

但是,這些發行版中有一些分支或風格是專門為避免使用 systemd 而創建的。 不僅如此,人們還可以選擇使用其他 init 系統來代替其發行版中默認提供的系統,例如 runit 或 s6-linux-init。

如何使用 systemd 在啟動時運行 Linux 程序
相關如何使用 systemd 在啟動時運行 Linux 程序

如果您必須管理一台不是您自己設置的 Linux 計算機,那麼確定它是否使用 systemd 的唯一方法是檢查。 我們可以通過使用pstree命令查看進程樹來做到這一點。 我們只需要查看樹的最頂端——畢竟我們正在尋找第一個運行的進程——所以我們將通過head命令管道輸出,並詢問前五個條目。

 pstree | 頭-5 

使用 pstree 通過 head 管道確定 Linux 安裝是否使用 systemd

我們可以看到systemd是啟動後運行的第一個進程,因此我們肯定是在基於 systemd 的 Linux 安裝上。

相關:如何從 Linux 終端管理進程:您需要知道的 10 個命令

使用 systemctl 列出服務

列出服務和守護進程的命令是systemctl 。 我們可以使用typestate選項來優化systemctl命令。 我們要求systemctl報告處於運行狀態的服務。

 systemctl --type=service --state=running 

使用 systemctl 列出正在運行的服務

生成信息表。 如果它對於您的終端窗口來說太寬或太長,它會顯示在您的默認文件查看器中,這可能會是less

在 less 文件查看器中顯示的 systemctl 調用的輸出

要查看表格的右端,請按右箭頭鍵。 要返回通常視圖,請按向左箭頭鍵。

在 less 文件查看器中顯示的 systemctl 調用輸出的右側部分

按Q鍵退出less。 顯示的列是:

  • Unit :服務或守護進程的名稱。 該列的標題為“Unit”,因為該列中的任何內容都是使用單元文件中的systemd信息啟動的。
  • Load :服務或守護程序的負載狀態。 它可以被加載、未找到、錯誤設置、錯誤或被屏蔽。
  • 活動:服務或守護程序所處的整體狀態。它可以是活動的、重新加載的、非活動的、失敗的、激活的或停用的。
  • SUB :服務或守護進程的子狀態。 它可以是死的、退出的、失敗的、不活動的或正在運行的。
  • 描述:單位的簡短描述。

如果我們想專注於單個服務,我們可以通過grep管道輸出systemctl的輸出。 此命令隔離ssh服務的表條目。

 systemctl --type=service --state=running | grep ssh 

使用 grep 從結果中隔離單個服務

到目前為止,我們一直在通過提供state=running選項來過濾表格的內容。 我們可以使用子狀態的任何可能值來代替:dead、exited、failed、inactive 或 running。

讓我們尋找失敗的服務:

 systemctl --type=service --state=失敗

使用 systemctl 報告失敗的服務

可以使用子狀態的組合。 以逗號分隔的列表形式鍵入它們。 確保您沒有在選項之間包含任何空格。 請注意,這會查找與任一狀態匹配的服務。

 systemctl --type=service --state=failed,exited 

查找失敗或使用 systemctl 退出的服務

按右箭頭鍵查看屏幕外的列顯示我們在列表中混合了退出和失敗的服務。

systemctl 發現的失敗和退出服務的混合

默認情況下, systemctl會列出由systemd啟動的進程(服務和守護進程),因為systemd找到了一個包含有效單元文件的單元文件。 這就是為什麼所有這些過程的簡稱都是“單位”。

有一個選項可以顯式請求systemctl列出單位,但由於它是默認操作,因此不經常使用。

這些命令產生相同的結果。

 sudo systemctl list-units --type=service --state=running
 sudo systemctl --type=service --state=running

使用 systemctl 列出單元文件

我們可以通過包含list-unit-files選項來擴展systemctl命令的範圍。 這不僅報告已啟動的服務和守護程序,還列出了您計算機上安裝的所有單元文件

 systemctl list-unit-files --state=enabled 

使用 systemctl 列出單元文件

顯示彩色表格。

systemctl生成的單元文件列表,顯示在less文件瀏覽器中

刪除state選項會刪除過濾。 輸出將包含所有已安裝的單元文件,無論它們的狀態如何。

 systemctl 列表單元文件

使用 systemctl 列出沒有過濾的單元文件

輸出將包含比先前命令的結果更多的條目。

systemctl 列出並顯示在less文件瀏覽器中的所有單元文件

在我們的測試計算機上,結果列表幾乎是我們之前命令輸出的四倍。

如果你確實想使用state選項,你可以像我們之前看到的那樣使用多個 state。 相同的規則適用。 以逗號分隔值的形式提供選項,並且不包含任何空格。

此命令將列出所有已禁用或無法啟動的單元文件。

 systemctl list-unit-files --state=enabled,失敗

使用 systemctl 查找與兩種狀態中的任何一種匹配的單元文件

顯示的結果數量減少,根據您使用 state 選項所做的選擇進行過濾。

systemctl 發現的禁用和失敗單元文件的混合

詳細查看一項服務

如果某項服務或守護程序的某些內容激起了您的興趣並值得深入研究,您可以使用 systemctl status 選項詳細查看它。

讓我們看一下 SSH 守護進程 sshd。 我們需要做的就是使用狀態選項和服務或守護進程的名稱。

 systemctl 狀態 sshd 

systemctl 顯示的單個服務的詳細信息

這個緊湊的顯示器顯示:

  • 服務的名稱和簡短的描述。 顏色編碼的點顯示它是否正在運行。 綠色表示正在運行,紅色表示未運行。
  • 加載了什麼,包括單元文件的路徑。
  • 它已經運行了多長時間。
  • 文檔位於man中的位置。
  • 正在運行的實例的進程 ID。
  • 此服務有多少並發實例正在運行。 通常這將是一個。
  • 正在消耗多少內存。
  • 消耗了多少 CPU 時間。
  • 服務所屬的控制組。

還會顯示系統日誌中的相關條目。 這些通常是諸如服務啟動之類的事件。 如果您正在查看未正確啟動的服務或守護程序,這些可能會提供信息。

相關:如何使用 journalctl 讀取 Linux 系統日誌

自主系統

服務和守護程序提供了操作系統的許多自動操作,因此它們至關重要。 這意味著他們的健康也很重要。

查看您的服務、守護程序和單元文件很容易,而且信息量很大。 如果服務或守護程序拒絕啟動,這也是一個有價值的故障排除步驟。

相關:如何解決 Linux 上的“打開文件過多”錯誤