systemd 負責解決系統管理中的很多問題。對于很多新手來說,對它可能不夠熟悉。比如,怎樣列出 systemd 的服務,可能就會讓你想半天。
本文將介紹如何列出 systemd 服務,并解釋它的輸出,以便大家能更容易理解服務的不同狀態。
在寫這篇文章的時候,我假設你對 systemd 有所了解。但是如果不了解,應該也沒什么問題...
如何列出 systemd 中活動的服務
systemd 服務由 systemctl 命令管理。如果我們不帶任何參數運行 systemctl,它會默認調用 list-units 子命令,列出各種類型的 systemd 單元,比如服務(services)、套接字(sockets)、目標(targets)等。
但是我們的目的是要列出服務,所以可以使用 --type選項指定單元類型(unit type),如下所示:
systemctl --type=service
是否注意到我沒有指定 list-units 子命令?因為它是默認的。如果想要按照約定使用,也可以指定。本文后面的部分會遵循這種約定。
systemctl list-units --type=service
上述兩個命令輸出是一樣的。默認情況下,該命令會按照字母順序列出已經加載且活動的服務:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
alsa-restore.service loaded active exited Save/Restore Sound Card State
apparmor.service loaded active exited Load AppArmor profiles
apport.service loaded active exited LSB: automatic crash report generation
我們來解釋一下上述輸出中的內容:
- UNIT :systemd 單元名稱;
- LOAD :單元配置文件是否已由 systemd 解析;
- ACTIVE :單元的高級別狀態(high level state);
- SUB :單元的低級別狀態。活動單元(active unit)可以處于運行狀態(running state)或退出狀態(exited state),此值取決于服務類型。
上面的例子,我們可以列出 Linux 系統上加載的服務。但活動的 systemd 服務可能正在運行,也可能已經退出(在成功運行后)。
列出所有正在運行的systemd服務
活動狀態(active state)也有一個子狀態(sub-status),比如正在運行(running)、已退出(exited)等。所以,可以在子狀態中使用 --state 選項。
要列出正在運行的 systemd 服務,可以指明 --state=running,如下:
systemctl list-units --type=service --state=running
以下是一個輸出的例子,列出了正在運行的 systemd 服務:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
bluetooth.service loaded active running Bluetooth service
bolt.service loaded active running Thunderbolt system service
列出所有已加載的systemd服務,包括非活動服務
默認情況下,systemctl 命令只列出已加載且活動的服務。如果要包含非活動的 服務,可以使用 --all 選項:
systemctl list-units --all --type=service
如下輸出示例:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
alsa-restore.service loaded active exited Save/Restore Sound Card State
alsa-state.service loaded inactive dead Manage Sound Card State (restore and store)
anacron.service loaded inactive dead Run anacron jobs
apparmor.service loaded active exited Load AppArmor profiles
列出所有非活動的systemd服務
如果要列出所有非活動的 systemd 服務,可以使用 --all 組合 --state 選項,如下:
systemctl list-units --all --type=service --state=inactive
如下為結果的輸出,只列出了非活動的 systemd 服務:
UNIT LOAD ACTIVE SUB DESCRIPTION
alsa-state.service loaded inactive dead Manage Sound Card State (restore and store)
anacron.service loaded inactive dead Run anacron jobs
apport-autoreport.service loaded inactive dead Process error reports when automatic reporting is enabled
apt-daily-upgrade.service loaded inactive dead Daily apt upgrade and clean activities
apt-daily.service loaded inactive dead Daily apt download activities
● auditd.service not-found inactive dead auditd.service
列出所有已安裝的systemd服務(即使未加載)
每一個 systemd 單元,包括服務(service),套接字(socket)或者其他的,都會有一個單元文件(unit file),所以我們可以利用其單元文件,列出所有已安裝的 systemd 服務:
systemctl list-unit-files --type=service
以下是輸出:
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
acpid.service disabled enabled
alsa-restore.service static enabled
alsa-state.service static enabled
alsa-utils.service masked enabled
anacron.service enabled enabled
apparmor.service enabled enabled
apport-autoreport.service static enabled
apport-forward@.service static enabled
列出系統啟動時會自動運行的 systemd 服務
要查看系統啟動時,會自動運行的 systemd 服務,可以使用如下命令:
systemctl list-unit-files --type=service --state=enabled
你可能會對上述命令中,指定的狀態為 enabled 有疑問,這很正常,很多新用戶經常會將服務的“啟用(enabled)”和“正在運行(running)”混淆。
這里,enabled systemd 服務表示系統啟動時會自動激活該服務。
以下為輸出:
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
anacron.service enabled enabled
apparmor.service enabled enabled
autovt@.service enabled enabled
avahi-daemon.service enabled enabled
binfmt-support.service enabled enabled
bluetooth.service enabled enabled
console-setup.service enabled enabled
containerd.service enabled enabled
cron.service enabled enabled
cups-browsed.service enabled enabled
cups.service enabled enabled
dbus-fi.w1.wpa_supplicant1.service enabled enabled
注意到結果中的 Vendor Preset 一列了嗎?它在前一個例子中也出現了。
Vendor preset 定義了安裝程序時 systemd 單元的自動行為。
假設我們安裝了一個新程序 XYZ,它有一個名為 xyz.service的服務,且 vendor preset狀態為啟用(enabled),這表示當啟動系統時,xyz.service將會被自動激活。
如果 vendor preset 設置為 disabled,則必須手動設置為啟用。一旦啟用,他就會跟隨系統自動啟動。
sudo systemd enable xyz.service
顯示某個特定 systemd 服務的狀態
上文我們介紹了幾種列出服務的方法。那么,怎樣查看某一個服務的狀態呢?
可以使用 systemctl 命令的子命令 status 來查看 systemd 服務的詳細信息。使用該命令時,tab 鍵會補全輸入。
systemctl status
以下是網絡管理器服務(network manager service)的例子:
$ systemctl status NetworkManager.service
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-07-23 08:12:44 IST; 3h 8min ago
Docs: man:NetworkManager(8)
Main PID: 711 (NetworkManager)
Tasks: 3 (limit: 9157)
Memory: 13.6M
CGroup: /system.slice/NetworkManager.service
└─711 /usr/sbin/NetworkManager --no-daemon
Jul 23 08:12:50 itsfoss NetworkManager[711]: <info> [1595472170.7159] device (wlp58s0): Activation: successful, device activated.
Jul 23 08:12:50 itsfoss NetworkManager[711]: <info> [1595472170.7179] manager: startup complete
Jul 23 08:12:51 itsfoss NetworkManager[711]: <info> [1595472171.5592] manager: NetworkManager state is now CONNECTED_GLOBAL
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.7973] dhcp6 (wlp58s0): activation: beginning transaction (timeout in 45 seconds)
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.8017] policy: set 'JioFi3_215810' (wlp58s0) as default for IPv6 routing and DNS
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.8058] dhcp6 (wlp58s0): option dhcp6_name_servers => 'fe80::a8dc:79ff:fe1b:57fe'
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.8059] dhcp6 (wlp58s0): state changed unknown -> bound
Jul 23 08:12:59 itsfoss NetworkManager[711]: <info> [1595472179.9251] agent-manager: agent[bdd71d4a66098713,:1.84/org.gnome.Shell.NetworkAgent/1>
Jul 23 11:18:10 itsfoss NetworkManager[711]: <info> [1595483290.7874] manager: NetworkManager state is now CONNECTED_SITE
Jul 23 11:18:11 itsfoss NetworkManager[711]: <info> [1595483291.5893] manager: NetworkManager state is now CONNECTED_GLOBAL
上面例子中,我們可以看到它顯示了很多信息,比如服務的狀態、man 手冊中的頁碼、內存使用情況、進程ID等,后面還顯示了服務的最后的幾個日志信息。
如果我們要在 shell 腳本中檢查服務是否處于活動(active)狀態,可以使用 is-active 子命令,0 表示已激活(active)。
systemctl is-active application.service
類似的,如果要檢查服務是否已啟用(設置為自啟動),可以使用 is-enabled 子命令,0 表示已啟用:
systemctl is-enabled application.service
以上就是本次分享全部內容,歡迎討論。
審核編輯:劉清
-
Linux系統
+關注
關注
4文章
593瀏覽量
27393 -
sub函數
+關注
關注
0文章
3瀏覽量
1009 -
unit技術
+關注
關注
0文章
2瀏覽量
1551
發布評論請先 登錄
相關推薦
評論