Linux 命令(107)—— systemctl 命令

1.命令簡介

systemctl 命令是操作系統和服務的管理命令,是與 systemd 交互的主要工具,其實現的功能包含了 service 和 chkconfig 這兩個命令的功能。

systemd(system daemon)是操作系統的服務的管理器,用於取代 system V 和 BSD 風格的 init 程序,是一號進程,掌管整個系統的其他進程,用於集中管理和配置類 UNIX 系統。每個服務都有一個啓動文件,描述 systemd 應該如何啓動自己。

2.命令格式

systemctl [OPTIONS...] COMMAND [NAME...]

3.選項說明

-t, --type=[help, UNITTYPE...]
	指明單元類型,使用逗號分隔。如果是 help,則列出所有可用的 unit type
--state=UNITSTATE...
	指明單元的狀態,使用逗號分隔。例如使用 --state=failed,則在輸出單元列表時只展示狀態爲 failed 的單元
-p, --property=PROPERTY...
	使用 show 命令顯示 unit/job/manager 屬性時,將顯示限制爲參數中指定的屬性,使用逗號分隔,例如屬性 MainPID
-a, --all
	列出單元時,顯示所有加載的單元,無論其狀態如何,包括非活動單元。顯示 unit/job/manager 屬性時,顯示所有屬性,無論它們是否已設置
-r, --recursive
	列出單元時,還顯示本地容器的單元。本地容器的單元將以容器名稱作爲前綴,並用單個冒號字符分隔
--reverse
	與命令 list-dependencies 一起使用,顯示單元之間的反向依賴項
--after
	與命令 list-dependencies 一起使用,顯示指定單元前面的單元
--before
	與命令 list-dependencies 一起使用,顯示指定單元后面的單元
-l, --full
	不要省略單元名稱、進程樹條目、日誌輸出,也不要截斷狀態、單元列表、作業列表和計時器列表輸出中的單元描述
--show-types
	顯示套接字時,顯示套接字的類型
--job-mode=MODE
	在對新作業排隊時,此選項控制如何處理已排隊的作業。可取值 fail、replace、replace_irreversibly、isolate、ignore-dependencies、ignore-requirements 或 flush 之一。默認爲 replace,除非使用了表示隔離作業模式的 isolate 命令
-i, --ignore-inhibitors
	當系統關閉或睡眠請求時,忽略約束鎖,否則系統關閉或睡眠請求會失敗。應用程序可以建立約束鎖,以避免某些重要操作(如CD刻錄或類似操作)被系統關閉或睡眠狀態中斷
-q, --quiet
	靜默模式,抑制 snapshot, is-active, is-failed, is-enabled, is-system-running, enable 和 disable 命令的標準輸出
--no-block
	不同步等待請求的操作完成。如果未指定該選項,驗證完作業並排隊,systemctl 將等待作業完成
--system
	與服務管理器(service manager)交互。爲缺省選項
--no-wall
	在 halt, power-off, reboot 操作前不發出警告
--no-reload
	當與命令 enable 和 disable 一起使用時,不隱式重新加載守護程序的配置
--no-ask-password
	當與 start 和相關命令一起使用時,禁止請求密碼
--kill-who=WHO
	與命令 kill 一起使用時,選擇向哪個進程發送信號。必須是 main、control 或 all 中的一個,分別選擇殺死主進程、控制進程還是單元的所有進程
-s, --signal=SIGNAL
	與命令 kill 一起使用,選擇向進程發送的信號。缺省爲 SIGTERM
-f, --force
	與 enable 一起使用時,覆蓋任何現有衝突的符號鏈接。與 halt、poweroff、reboot 或 kexec 一起使用時,在不關閉所有單元的情況下執行所選操作
--now
	當與 enable 一起使用時,單元也將啓動。當與 disable 或 mask 一起使用時,單元也將停止
--root=PATH
	當與 enable/disable/is-enabled(等相關命令)一起使用時,在查找單元文件時使用指定的根路徑
--runtime
	當與 enable、disable、edit(等相關命令)一起使用時,只需臨時進行更改,以便在下次系統重新啓動時丟失這些更改
--preset-mode=MODE
	與命令 preset 或 preset-all 一起使用時,預設模式爲 full(缺省)、enable-only 或 disable-only 三者之一
-n, --lines=NUM
	與命令 status 一起使用時,控制日誌文件顯示的行數。默認爲 10
-o, --output=FORMAT
	與命令 status 一起使用時,控制日誌條目的顯示格式,默認爲 short。其它取值可參考明林 journalctl(1)
--plain
	當與命令 list-dependencies 一起使用時,輸出將打印爲列表而不是樹
-H, --host=HOST
	指定遠程主機名,或用戶名@主機名進行遠程操作。機名可以選擇用一個容器名作爲後綴,用 : 分隔
-M, --machine=MACHINE
	指定本地容器名
--no-pager
	不將管道輸出送到分頁瀏覽工具
--no-legend
	不打印列頭和列腳
-h, --help
	顯示幫助信息並退出
--version
	顯示版本信息並退出

4.命令說明

實際上 systemctl 子命令的使用頻率會比選項更加頻繁,主要有單元命令(Unit Commands)、單元文件命令(Unit File Commands)、容器命令(Machine Commands)、作業命令(Job Commands)、快照命令(Snapshot Commands)、環境命令(Environment Commands)、管理器生命週期命令(Manager Lifecycle Commands)、系統命令(System Commands)

4.1 單元命令(Unit Commands)

list-units [PATTERN...]
	列出所有已啓動的單元。如果指定一個或多個匹配模式,則只顯示符合某個模式的單元。該命令爲默認命令
list-sockets [PATTERN...]
	列出套接字單元,按照監聽的地址排列輸出。如果指定一個或多個匹配模式,則只顯示符合某個模式的單元
list-timers [PATTERN...]
	列出按時間順序排列的計時器單元。如果指定一個或多個匹配模式,則只顯示符合某個模式的單元
start PATTERN...
	啓動指定的單元
stop PATTERN...
	停止指定的單元
reload PATTERN...
	重新加載指定單元服務的配置文件。注意,是重新加載服務的配置,而不是 systemd 的單元配置文件。如果希望 systemd 重新加載單元的配置文件,請使用 daemon-reload 命令。換句話說:對於 Apache 的示例,這將在 web 服務器中重新加載 Apache 的 httpd.conf,而不是 apache.service systemd 單元文件
restart PATTERN...
	重啓指定的單元
try-restart PATTERN...
	嘗試重啓指定的單元。如果單元不處於運行狀態,則不進行重啓
reload-or-restart PATTERN...
	重新加載指定單元服務的配置文件。如果失敗則重啓服務
reload-or-try-restart PATTERN...
	重新加載指定單元服務的配置文件。如果失敗則嘗試重啓服務。如果單元不處於運行狀態,則不進行重啓
isolate NAME
	啓動命令行中指定的單元及其依賴項,並停止所有其他的單元
kill PATTERN...
	向單元的一個或多個進程發送信號。使用 --kill who= 選擇要終止的進程。使用 --signal= 選擇要發送的信號
is-active PATTERN...
	檢查指定單元是否處於 active 狀態。如果至少一個是活動的,則返回退出代碼 0,否則爲非零
is-failed PATTERN...
	檢查指定單元是否處於 failed 狀態。如果至少一個是失敗的,則返回退出代碼 0,否則爲非零
status [PATTERN...|PID...]
	顯示一個或多個單元的簡要運行時狀態信息,然後是日誌中的最新日誌數據。如果未指定單位,則顯示系統狀態。如果與 --all 結合使用,還將顯示所有單元的狀態。如果給定 PID,則顯示進程所屬單元的信息
show [PATTERN...|JOB...]
	顯示一個或多個單元、作業或管理器本身的屬性。如果未指定參數,則將顯示管理器的屬性
cat PATTERN...
	顯示一個或多個單元的配置文件
set-property NAME ASSIGNMENT...
	在運行時設置指定的單元屬性。如果同時使用 --runtime 選項,則下一次系統重啓屬性將失效
help PATTERN...|PID...
	顯示一個或多個單元的手冊頁(如果可用)。如果給定了PID,則顯示該進程所屬單元的手冊頁
reset-failed [PATTERN...]
	重置指定單元的 failed 狀態,如果未指定單元名稱,則重置所有單元的 failed 狀態
list-dependencies [NAME]
	顯示指定單元所依賴的單元。它遞歸地列出 Requires=、RequiresOverridable=、Requisite=、RequisiteOverridable=、Wants=、BindsTo= 依賴項之後的單元。如果未指定單位,缺省爲 default.target

4.2 單元文件命令(Unit File Commands)

list-unit-files [PATTERN...]
	列出已安裝的單元文件及其啓用狀態
enable NAME...
	啓用一個或多個單元文件或單元文件實例。這將創建一些符號鏈接,記錄在單元文件的 Install 部分。創建符號鏈接後,將重新加載 systemd 配置以確保立即生效
disable NAME...
	禁用一個或多個單元。這將從單元配置目錄中刪除指向指定單元文件的所有符號鏈接,從而撤消由 enable 所做的更改。移除符號鏈接後,將重新加載 systemd 配置以確保立即生效。注意,此命令不會隱式停止正在禁用的單元。如果需要的話,使用 --now 選項,要麼在之後執行一個附加的 stop 命令
reenable NAME...
	重新啓用一個或多個單元文件。這是 disable 和 enable 的組合,用於將啓用單元的符號鏈接重置爲單元文件 Install 部分中配置的值
preset NAME...
	重置指定單元文件的 disable/enable 狀態爲預設策略文件中配置的值。可以與選項 --preset-mode 聯用選擇重置的結果狀態。關於預設策略格式的詳細信息,參見 systemd.preset(5)
preset-all
	將所有已安裝的單元文件重置爲預設策略文件中配置的默認值。可以與選項 --preset-mode 聯用選擇重置的結果狀態
is-enabled NAME...
	檢查是否啓用了指定的單元文件
mask NAME...
	屏蔽一個或多個單元文件,把這些單元鏈接到 /dev/null,使它們無法啓動
unmask NAME...
	反屏蔽一個或多個單元文件
link FILENAME...
	將不在單元文件搜索路徑中的單元文件鏈接到單元文件搜索路徑中,這需要單元文件的絕對路徑
add-wants TARGET NAME..., add-requires TARGET NAME...
	給指定單元添加依賴
edit NAME...
	編輯插入片段或使用選項 --full 表示替換整個文件,以擴展或重寫指定的單元
get-default
	返回別名爲 default.target 的單元
set-default NAME
	設置默認的單元,使 default.target 軟鏈接到目標單元

4.3 容器命令(Machine Commands)

list-machines [PATTERN...]
	列出主機和所有正在運行的本地容器及其狀態。如果指定了一個或多個模式,則只顯示與其中一個模式匹配的容器

4.4 作業命令(Job Commands)

list-jobs [PATTERN...]
	
cancel JOB...
	列出正在進行的作業。如果指定了一個或多個模式,則只顯示與其中一個模式匹配的單元的作業
cancel JOB...
	取消一個或多個指定作業 ID 的作業。如果未指定作業 ID,則取消所有掛起的作業

4.5 快照命令(Snapshot Commands)

snapshot [NAME]
	創建指定名稱的快照。如果未指定快照名則自動生成。快照指的是 systemd 管理器的保存狀態。它被實現爲一個使用此命令動態生成的單元,並且依賴於當時活動的所有單元。稍後,用戶可以使用快照單元上的 isolate 命令返回到該狀態
delete PATTERN...
	刪除快照

4.6 環境命令(Environment Commands)

show-environment
	顯示 systemd manager 使用的環境變量
set-environment VARIABLE=VALUE...
	設置 systemd manager 使用的環境變量
unset-environment VARIABLE...
	取消一個或多個 systemd manager 的環境變量
import-environment [VARIABLE...]
	將客戶端上設置的一個或多個環境變量導入 systemd manager 環境塊。如果未傳遞參數,則導入整個環境塊

4.7 管理器生命週期命令(Manager Lifecycle Commands)

daemon-reload
	重新加載 systemd 管理器配置。這將重新運行所有生成器(請參閱 systemd.generator(7)),重新加載所有單元文件,並重新創建整個依賴關係樹。在重新加載守護進程時,所有 systemd 監聽的代表用戶配置的 sockets,保持可訪問狀態
daemon-reexec
	重新執行 systemd 管理器

4.8 系統命令(System Commands)

is-system-running
	檢查系統是否正在運並返回當前的系統狀態,狀態有 initializing,starting,running,degraded,maintenance,stopping
default
	進入默認模式,等同於子命令 isolate default.target
rescue
	進入救援模式。等同於子命令 isolate rescue.target,會向所有用戶打印警告消息
emergency
	進入緊急模式。等同於子命令 isolate emergency.target,會向所有用戶打警告消息
halt
	關閉並停止系統。等同於子命令 start halt.target --irreversible
poweroff
	關閉並關閉系統電源。等同於子命令 start poweroff.target --irreversible,會向所有用戶打印警告消息
reboot [arg]
	關閉並重新啓動系統。等同於子命令 start reboot.target --irreversible,會向所有用戶打印警告消息
kexec
	通過 kexec 關閉並重新啓動系統。等同於子命令 start kexec.target --irreversible,會向所有用戶打印警告消息
switch-root ROOT [INIT]
	切換到不同的根目錄並在其下執行新的系統管理器進程
suspend
	暫停系統
hibernate
	使系統休眠。這將激活特殊的 hibernate.target 目標
hybrid-sleep
	休眠並掛起系統。這將激活特殊的 hybrid-sleep.target 目標

實際上,systemctl 常用的子命令並不多,主要有:

start	啓動服務
stop	停止服務
restart	重啓服務
enable	使某服務開機自啓
disable	關閉某服務開機自啓
status	查看服務狀態
list-units -–type=service 列舉所有已啓動服務

5.常用示例

(1)使用 systemctl 管理系統。

# 重啓系統
systemctl reboot

# 關閉系統,切斷電源
systemctl poweroff

# CPU停止工作
systemctl halt

# 暫停系統
systemctl suspend

# 讓系統進入冬眠狀態
systemctl hibernate

# 讓系統進入交互式休眠狀態
systemctl hybrid-sleep

# 啓動進入救援狀態(單用戶狀態)
systemctl rescue

(2)使用 systemctl list-units 查看系統的單元。

# 列出正在運行的 unit
systemctl
# 或
systemctl list-units

# 列出所有 unit,包括沒有運行的 unit
systemctl list-units --all

# 列出所有沒有運行的 unit
systemctl list-units --all --state=inactive

# 列出所有加載失敗的 unit
systemctl list-units --failed

# 列出所有正在運行的、類型爲 service 的 unit
systemctl list-units --type=service

(3)使用 systemctl status 查看系統狀態和單個 unit 的狀態。

# 顯示系統狀態
systemctl status

# 顯示單個 unit 的狀態
sysystemctl status sshd.service

# 顯示遠程主機的某個 unit 的狀態
systemctl -H [email protected] status httpd.service

(4)服務管理。

# 啓動一個服務
systemctl start apache.service

# 停止一個服務
systemctl stop apache.service

# 重啓一個服務
systemctl restart apache.service

# 殺死一個服務的所有子進程
systemctl kill apache.service

# 重新加載一個服務的配置文件
systemctl reload apache.service

# 重新加載 systemd 管理器配置
systemctl daemon-reload

# 顯示某個 unit 的所有底層參數
systemctl show httpd.service

# 顯示某個 unit 的指定屬性的值
systemctl show -p CPUShares httpd.service

# 設置某個 unit 的指定屬性
systemctl set-property httpd.service CPUShares=500

(5)查看 unit 之間的依賴關係。
A 依賴於 B,意味着 systemd 在啓動 A 的時候,同時會去啓動 B。

# 列出一個 Unit 的所有依賴
$ systemctl list-dependencies nginx.service

上面命令的輸出結果之中,有些依賴是 Target 類型,默認不會展開顯示。如果要展開 Target,就需要使用 --all 參數。

systemctl list-dependencies --all nginx.service

(6)設置服務開機啓動。
systemd 默認從目錄 /etc/systemd/system/ 讀取配置文件。但是,裏面存放的大部分文件都是符號鏈接,指向目錄 /usr/lib/systemd/system/,真正的配置文件存放在那個目錄。systemctl enable命令用於在上面兩個目錄之間,建立符號鏈接關係。

systemctl enable sshd.service
# 等同於
ln -s /usr/lib/systemd/system/sshd.service /etc/systemd/system/multi-user.target.wants/sshd.service'

如果配置文件裏面設置了開機啓動,systemctl enable命令相當於激活開機啓動。與之對應的,systemctl disable 命令用於在兩個目錄之間,撤銷符號鏈接關係,相當於撤銷開機啓動。

systemctl disable sshd.service

配置文件的後綴名,就是該 unit 的種類,比如 sshd.socket。如果省略,systemd 默認後綴名爲 .service,所以 sshd 會被理解成 sshd.service。

6.拓展知識

6.1 Unit

6.1.1 配置文件的格式

systemd 可以管理所有系統資源,不同的資源統稱爲單元(unit)。unit 一共分成 12 種。

Service unit:系統服務
Target unit:多個 Unit 構成的一個組
Device Unit:硬件設備
Mount Unit:文件系統的掛載點
Automount Unit:自動掛載點
Path Unit:文件或路徑
Scope Unit:不是由 Systemd 啓動的外部進程
Slice Unit:進程組
Snapshot Unit:Systemd 快照,可以切回某個快照
Socket Unit:進程間通信的 socket
Swap Unit:swap 文件
Timer Unit:定時器

每一個 Unit 都有一個配置文件,告訴 Systemd 怎麼啓動這個 Unit 。配置文件就是普通的文本文件,可以用文本編輯器打開,也可以使用 systemctl cat 命令查看配置文件的內容。

systemctl cat sshd.service

# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

從上面的輸出可以看到,配置文件分成幾個區塊。每個區塊的第一行,是用方括號表示的區別名,比如[Unit]。注意,配置文件的區塊名和字段名,都是大小寫敏感的。每個區塊內部是一些等號連接的鍵值對。注意,鍵值對的等號兩側不能有空格。

6.1.2 配置文件的區塊

[Unit]區塊通常是配置文件的第一個區塊,用來定義 Unit 的元數據,以及配置與其他 Unit 的關係。它的主要字段如下。

Description:簡短描述
Documentation:文檔地址
Requires:當前 Unit 依賴的其他 Unit,如果它們沒有運行,當前 Unit 會啓動失敗
Wants:與當前 Unit 配合的其他 Unit,如果它們沒有運行,當前 Unit 不會啓動失敗
BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行
Before:如果該字段指定的 Unit 也要啓動,那麼必須在當前 Unit 之後啓動
After:如果該字段指定的 Unit 也要啓動,那麼必須在當前 Unit 之前啓動
Conflicts:這裏指定的 Unit 不能與當前 Unit 同時運行
Condition...:當前 Unit 運行必須滿足的條件,否則不會運行
Assert...:當前 Unit 運行必須滿足的條件,否則會報啓動失敗

[Service]區塊用來 Service 的配置,只有 Service 類型的 Unit 纔有這個區塊。它的主要字段如下。

Type:定義啓動時的進程行爲。它有以下幾種值。
Type=simple:默認值,執行ExecStart指定的命令,啓動主進程
Type=forking:以 fork 方式從父進程創建子進程,創建後父進程會立即退出
Type=oneshot:一次性進程,Systemd 會等當前服務退出,再繼續往下執行
Type=dbus:當前服務通過D-Bus啓動
Type=notify:當前服務啓動完畢,會通知Systemd,再繼續往下執行
Type=idle:若有其他任務執行完畢,當前服務纔會運行
ExecStart:啓動當前服務的命令
ExecStartPre:啓動當前服務之前執行的命令
ExecStartPost:啓動當前服務之後執行的命令
ExecReload:重啓當前服務時執行的命令
ExecStop:停止當前服務時執行的命令
ExecStopPost:停止當其服務之後執行的命令
RestartSec:自動重啓當前服務間隔的秒數
Restart:定義何種情況 Systemd 會自動重啓當前服務,可能的值包括always(總是重啓)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
Environment:指定環境變量

[Install]通常是配置文件的最後一個區塊,用來定義如何啓動,以及是否開機啓動。它的主要字段如下。

WantedBy:它的值是一個或多個 Target,當前 Unit 激活時(enable)符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .wants後綴構成的子目錄中
RequiredBy:它的值是一個或多個 Target,當前 Unit 激活時,符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .required後綴構成的子目錄中
Alias:當前 Unit 可用於啓動的別名
Also:當前 Unit 激活(enable)時,會被同時激活的其他 Unit

6.1.3 配置文件的狀態

systemctl list-unit-files 命令用於列出所有配置文件。

# 列出所有配置文件
$ systemctl list-unit-files

# 列出指定類型的配置文件
$ systemctl list-unit-files --type=service

這個命令會輸出一個列表。

systemctl list-unit-files

UNIT FILE              STATE
chronyd.service        enabled
[email protected]         static
[email protected]     disabled

這個列表顯示每個配置文件的狀態,一共有四種。

enabled:已建立啓動鏈接
disabled:沒建立啓動鏈接
static:該配置文件沒有[Install]部分(無法執行),只能作爲其他配置文件的依賴
masked:該配置文件被禁止建立啓動鏈接

注意,從配置文件的狀態無法看出,該 Unit 是否正在運行。這必須執行前面提到的 systemctl status 命令。

systemctl status sshd.service

一旦修改配置文件,就要讓 SystemD 重新加載配置文件,然後重新啓動,否則修改不會生效。

systemctl daemon-reload
systemctl restart httpd.service

6.2 Target

啓動計算機的時候,需要啓動大量的 Unit。如果每一次啓動,都要一一寫明本次啓動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。

簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啓動某個 Target 的時候,Systemd 就會啓動裏面所有的 Unit。從這個意義上說,Target 這個概念類似於"狀態點",啓動某個 Target 就好比啓動到某種狀態。

傳統的init啓動模式裏面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啓動,但是多個 Target 可以同時啓動。

# 查看當前系統的所有 Target
systemctl list-unit-files --type=target

# 查看一個 Target 包含的所有 Unit
systemctl list-dependencies multi-user.target

# 查看啓動時的默認 Target
systemctl get-default

# 設置啓動時的默認 Target
systemctl set-default multi-user.target

# 切換 Target 時,默認不關閉前一個 Target 啓動的進程,systemctl isolate 命令改變這種行爲,關閉前一個 Target 裏面所有不屬於後一個 Target 的進程
systemctl isolate multi-user.target

Target 與 傳統 RunLevel 的對應關係如下。

Traditional runlevel      New target name     Symbolically linked to...

Runlevel 0           |    runlevel0.target -> poweroff.target
Runlevel 1           |    runlevel1.target -> rescue.target
Runlevel 2           |    runlevel2.target -> multi-user.target
Runlevel 3           |    runlevel3.target -> multi-user.target
Runlevel 4           |    runlevel4.target -> multi-user.target
Runlevel 5           |    runlevel5.target -> graphical.target
Runlevel 6           |    runlevel6.target -> reboot.target

它與init進程的主要差別如下。

(1)默認的 RunLevel(在/etc/inittab文件設置)現在被默認的 Target 取代,位置是/etc/systemd/system/default.target,通常符號鏈接到 graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。

(2)啓動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。

(3)配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄。現在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄裏面的修改可以覆蓋原始設置。

6.3 日誌管理

Systemd 統一管理所有 Unit 的啓動日誌。帶來的好處就是,可以只用 journalctl 一個命令,查看所有日誌(內核日誌和應用日誌)。日誌的配置文件是 /etc/systemd/journald.conf。

journalctl 功能強大,用法非常多。

# 查看所有日誌(默認情況下,只保存本次啓動的日誌)
journalctl

# 查看內核日誌(不顯示應用日誌)
journalctl -k

# 查看系統本次啓動的日誌
journalctl -b
journalctl -b -0

# 查看上一次啓動的日誌(需更改設置)
journalctl -b -1

# 查看指定時間的日誌
journalctl --since="2012-10-30 18:17:16"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2015-01-10" --until "2015-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"

# 顯示尾部的最新10行日誌
journalctl -n

# 顯示尾部指定行數的日誌
journalctl -n 20

# 實時滾動顯示最新日誌
journalctl -f

# 查看指定服務的日誌
journalctl /usr/lib/systemd/systemd

# 查看指定進程的日誌
journalctl _PID=1

# 查看某個路徑的腳本的日誌
$ sudo journalctl /usr/bin/bash

# 查看指定用戶的日誌
journalctl _UID=33 --since today

# 查看某個 Unit 的日誌
journalctl -u nginx.service
journalctl -u nginx.service --since today

# 實時滾動顯示某個 Unit 的最新日誌
journalctl -u nginx.service -f

# 合併顯示多個 Unit 的日誌
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定優先級(及其以上級別)的日誌,共有 8 級
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug

journalctl -p err -b

# 日誌默認分頁輸出,--no-pager 改爲正常的標準輸出
journalctl --no-pager

# 以 JSON 格式(單行)輸出
journalctl -b -u nginx.service -o json

# 以 JSON 格式(多行)輸出,可讀性更好
journalctl -b -u nginx.serviceqq -o json-pretty

# 顯示日誌佔據的硬盤空間
journalctl --disk-usage

# 指定日誌文件佔據的最大空間
journalctl --vacuum-size=1G

# 指定日誌文件保存多久
journalctl --vacuum-time=1years

參考文獻

[1] systemctl(1) manual
[2] systemd(1) manual
[3] 最簡明扼要的 Systemd 教程,只需十分鐘
[4] 【Linux】一步一步學Linux——systemctl命令(147)
[5] 阮一峯的網絡日誌Systemd 入門教程:命令篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章