Scroll to navigation

SYSTEMCTL(1) systemctl SYSTEMCTL(1)

NAME

systemctl - 控制 systemd 系統與服務管理器

SYNOPSIS

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

描述

systemctl 可用於檢查和控制 systemd(1) 系統與服務管理器的狀態。

選項

能夠識別的命令行選項如下:

-t, --type=

參數必須是一個 逗號分隔的單元類型列表(例如"service,socket")。

在列出單元時,如果使用了此選項, 那麼表示只列出指定類型的單元, 否則將列出所有類型的單元。

此外,作爲特例,使用 --type=help 表示在列出所有可用的單元類型之後退出。

--state=

參數必須是一個逗號分隔的單元狀態列表(只有 LOAD, ACTIVE, SUB 三大類)。 在列出單元時,如果使用了此選項,那麼表示只列出處於指定狀態的單元, 否則將列出所有狀態的單元。 例如,使用 --state=failed 表示只列出處於失敗(failed)狀態的單元。

此外,作爲特例,使用 --state=help 表示在列出所有可用的單元狀態之後退出。

-p, --property=

參數必須是一個逗號分隔的屬性名稱列表(例如"MainPID,LogLevel"), 表示在使用 show 命令顯示屬性時, 僅顯示參數中列出的屬性。 如果未指定此選項,那麼將顯示全部屬性。 如果多次指定此選項, 那麼相當於將這些選項的參數用逗號連接起來。

不帶參數的 systemctl show 命令 將會顯示管理器(systemd)自身的屬性(參見 systemd-system.conf(5) 手冊)。

不同類型的單元擁有不同的屬性集, 指定任意一個單元(即使並不存在),都可以查看此類單元的所有屬性。 類似的,即使指定了一個不存在的任務(job),也能查看任務的所有屬性。 每種單元能夠擁有的屬性集分散在 systemd.unit(5) 手冊 以及此類單元專屬的手冊中,例如 systemd.service(5), systemd.socket(5) 等等。

-a, --all

在列出單元時,表示列出所有已加載的單元。 在使用 show 命令顯示屬性時, 表示顯示所有屬性,而不管這些屬性是否已被設置。

如果想要列出所有已安裝的單元,請使用 list-unit-files 命令。

-r, --recursive

在列出單元時, 同時也以 "容器名:單元名" 格式列出本地容器中的單元。

--reverse

在使用 list-dependencies 命令時, 僅顯示單元之間的反向依賴關係。 也就是僅顯示 WantedBy=, RequiredBy=, PartOf=, BoundBy= 系列(而不是 Wants= 系列)的依賴關係。

--after

在使用 list-dependencies 命令時, 僅顯示在先後順序上早於指定單元的那些單元, 也就是遞歸的列出 After= 中的單元。

注意,每個 After= 依賴都會自動生成一個對應的 Before= 依賴。 單元之間的先後順序既可以被顯式的明確設定, 也可以由其他指令隱式的自動生成(例如 WantedBy=RequiresMountsFor=)。 無論是隱式自動生成的先後順序, 還是顯式明確設定的先後順序, 都會被 list-dependencies 命令顯示出來。

--before

在使用 list-dependencies 命令時, 僅顯示在先後順序上晚於指定單元的那些單元, 也就是遞歸的列出 Before= 中的單元。

-l, --full

status, list-units, list-jobs, list-timers 命令的輸出中, 顯示完整的單元名稱、進程樹項目、日誌輸出、單元描述, 也就是不省略或截斷它們。

--value

在使用 show 命令顯示屬性時, 僅顯示屬性值,而不顯示屬性名及等號。

--show-types

在使用 list-sockets 命令列出套接字(socket)時,同時顯示套接字的類型。

--job-mode=

在向任務隊列中添加新任務(job)時,如何處理隊列中已有的任務。 可設爲 "fail", "replace", "replace-irreversibly", "isolate", "ignore-dependencies", "ignore-requirements", "flush" 之一。 僅在使用 isolate 命令時,默認值爲 "isolate" 且不能更改, 對於其他命令,默認值皆爲 "replace" 。

"fail" 表示當新任務與隊列中已有的任務衝突時,該命令將失敗。 所謂"衝突"的含義是:導致隊列中已有的某個啓動操作轉變爲停止操作,或者相反。

"replace" 表示將隊列中衝突的任務替換爲新任務。

"replace-irreversibly" 與 "replace" 類似, 不同之處在於將新任務同時標記爲"不可撤銷", 也就是即使未來與其他新添加的任務發生衝突也不會被撤消。 注意,這個"不可撤銷"的任務, 仍然可以使用 cancel 命令顯式的撤消。

"isolate" 僅用於啓動操作,表示在該單元啓動之後,所有其他單元都會被停止。 當使用 isolate 命令的時候, 這是默認值,且不能更改。

"flush" 表示撤消隊列中已有的全部任務,然後加入新任務。

"ignore-dependencies" 表示忽略新任務的所有依賴關係(包括先後順序依賴), 立即執行請求的操作。 如果成功, 那麼所有被依賴的單元及先後順序都將被忽略。 僅用於調試目的,切勿用於常規目的。

"ignore-requirements" 類似於 "ignore-dependencies" , 表示僅忽略必需的依賴(但依然遵守單元之間的先後順序)。

--fail

這是 --job-mode=fail 的快捷方式。

當與 kill 命令一起使用時, 表示如果沒有任何單元被殺死,那麼將會導致報錯。

-i, --ignore-inhibitors

當關閉或休眠系統時,忽略 inhibitor 鎖。 應用程序可以利用 inhibitor 鎖防止某些重要操作(例如刻錄光盤)被關機或休眠打斷。 任何用戶都可以獲取 inhibitor 鎖, 但是隻有特權用戶可以撤消或者忽略它。 正常情況下, 關機與休眠動作會因爲 inhibitor 鎖的存在而失敗(無論該動作是否由特權用戶發起), 同時所有已激活的 inhibitor 鎖也都會被顯示出來。 但如果使用了此選項, 那麼 inhibitor 鎖將被忽略,關機或休眠將會照常執行, 同時也不再顯示這些已激活的鎖。

-q, --quiet

安靜模式,也就是禁止輸出任何信息到標準輸出。 注意:(1)這並不適用於輸出信息是唯一結果的命令(例如 show); (2)顯示在標準錯誤上的出錯信息永遠不會被屏蔽。

--no-block

默認爲阻塞模式,也就是任務經過校驗、排入任務隊列之後, systemctl 必須一直等到單元啓動/停止完成纔算執行結束。 使用此選項之後,將變爲無阻塞模式,也就是任務排入隊列之後, 即算 systemctl 執行結束(不必等待單元啓動/停止完成)。

--user

與當前調用用戶的用戶服務管理器(systemd 用戶實例)通信, 而不是默認的系統服務管理器(systemd 系統實例)。

--system

與系統服務管理器(systemd 系統實例)通信, 這是默認值。

--no-wall

在執行 halt, poweroff, reboot 動作前,不發送警告消息。

--global

表示在全局用戶單元目錄(通常是 /etc/systemd/user/)上操作, 從而全局的操作一個用戶單元,這會影響到所有未來登入的用戶。

--no-reload

enable, disable, edit 命令連用, 表示在完成操作之後不重新加載 systemd 守護進程的配置(默認會自動重新加載), 相當於不自動執行 daemon-reload 命令。

--no-ask-password

start 及其相關命令(reload, restart, try-restart, reload-or-restart, reload-or-try-restart, isolate)連用, 表示不詢問密碼。 單元在啓動時可能要求輸入密碼(例如用於解密證書或掛載加密文件系統)。 當未使用此選項時, systemctl 將會在終端上向用戶詢問所需的密碼。 如果使用了此選項, 那麼必須通過其他方法提供密碼(例如通過密碼代理程序), 否則單元可能會啓動失敗。 使用此選項還會導致在驗證用戶身份時, 不能使用從終端輸入密碼的方式。

--kill-who=

kill 命令連用, 表示向哪個進程發送信號(--signal=)。 可設爲 main(僅殺死主進程) 或 control(僅殺死控制進程) 或 all(殺死全部進程,這是默認值)。 所謂"主進程"是指定義了單元生存期的進程。 所謂"控制進程"是指用於改變單元狀態的進程。 例如,所有 ExecStartPre=, ExecStop=, ExecReload= 啓動的進程都是控制進程。 注意,對於一個單元來說,同一時刻只能存在一個控制進程, 因爲同一時刻只能存在一個狀態變化的動作。 對於 Type=forking 類型的服務來說, ExecStart= 啓動的初始進程就是一個控制進程, 而此進程隨後派生出來作爲守護進程運行的那個進程, 則是該單元的主進程(如果它可以被檢測到的話)。 但對於其他類型的服務來說, ExecStart= 啓動的初始進程反而始終是該服務的主進程。 一個服務單元可以包含以下進程: 零個或一個主進程,零個或一個控制進程, 任意數量(可以是零個)的其他進程。 注意,不是所有類型的單元都含有上述三種進程。 例如,對於 mount 類型的單元來說, 就僅有控制進程(/usr/bin/mount 與 /usr/bin/umount), 而沒有主進程。 默認值是 all

-s, --signal=

kill 命令連用, 表示向目標進程發送哪個信號。 必須是 SIGTERM, SIGINT, SIGSTOP 之類衆所周知的信號。 默認值爲 SIGTERM 。 .RE

-f, --force

當與 enable 命令連用時, 表示覆蓋所有現存的同名符號鏈接。

當與 edit 命令連用時, 表示創建所有尚不存在的指定單元。

當與 halt, poweroff, reboot, kexec 命令連用時,表示跳過單元的正常停止步驟,強制直接執行關機操作。 如果僅使用此選項一次,那麼所有進程都將被強制殺死,並且所有文件系統都將被卸載(或以只讀模式重新掛載)。 這可以算是一種野蠻但還算相對比較安全的快速關機或重啓的方法。 如果連續兩次使用此選項,那麼將既不殺死進程,也不卸載文件系統, 而是直接強制關機或重啓(但 kexec 除外)。 警告:連續兩次使用 --force 選項將會導致數據丟失、文件系統不一致等不良後果。 注意,如果連續兩次使用 --force 選項,那麼所有操作都將由 systemctl 自己直接執行,而不會與 systemd 進程通信。 這意味着,即使 systemd 進程已經僵死或者崩潰,連續兩次使用 --force 選項所指定的操作依然能夠執行成功。

--message=

當與 halt, poweroff, reboot, kexec 命令一起使用時, 用於設置一個解釋爲什麼進行該操作的字符串。 此字符串將與默認的關機消息一起記錄到日誌中。

--now

當與 enable 命令連用時, 表示同時還要啓動該單元。 當與 disablemask 命令連用時, 表示同時還要停止該單元。

--root=

enable/disable/is-enabled 等相關命令連用,用於設置尋找單元文件時的根目錄。

--runtime

當與 enable, disable, edit 等相關命令連用時, 表示僅作臨時變更,從而確保這些變更會在重啓後丟失。 這意味着所做的變更將會保存在 /run 目錄下(立即生效但重啓後該目錄的內容將全部丟失), 而不是保存在 /etc 目錄下。

類似的,當與 set-property 命令連用時, 所做的變更亦是臨時的, 這些變更在重啓後亦會丟失。

--preset-mode=

presetpreset-all 命令連用,可設爲下列值之一: "full"(默認值) 表示完全按照預設規則啓用與停用各單元。 "enable-only" 表示僅按照預設規則啓用各單元。 "disable-only" 表示僅按照預設規則停用各單元。

-n, --lines=

status 命令連用, 控制日誌的顯示行數(從最新的一行開始計算)。 必須設爲一個正整數,默認值是"10"。

-o, --output=

status 命令連用, 控制日誌的顯示格式。 詳見 journalctl(1) 手冊。默認值爲 "short" 。 .RE

--firmware-setup

reboot 命令連用, 要求系統主板的UEFI固件重啓到安裝模式。 僅支持某些以UEFI模式啓動的主板。

--plain

list-dependencies, list-units, list-machines 命令連用, 將輸出從默認的樹形變爲列表型。

-H, --host=

操作指定的遠程主機。可以僅指定一個主機名(hostname), 也可以使用 "username@hostname" 格式。 hostname 後面還可以加上容器名(以冒號分隔), 也就是形如 "hostname:container" 的格式, 以表示直接連接到指定主機的指定容器內。 操作將通過SSH協議進行,以確保安全。 可以通過 machinectl -H HOST 命令列出遠程主機上的所有容器名稱。

-M, --machine=

在本地容器內執行操作。 必須明確指定容器的名稱。

--no-pager

不將程序的輸出內容管道(pipe)給分頁程序。

--no-legend

不輸出列標題, 也就是不在輸出列表的頭部和尾部顯示字段的名稱。

-h, --help

顯示簡短的幫助信息並退出。

--version

顯示簡短的版本信息並退出。

命令

模式(PATTERN)參數的語法與文件名匹配語法類似:用"*"匹配任意數量的字符,用"?"匹配單個字符,用"[]"匹配字符範圍。 如果給出了模式(PATTERN)參數,那麼表示該命令僅作用於單元名稱與至少一個模式相匹配的單元。

單元命令

list-units [PATTERN...]
列出 systemd 已加載的單元。 除非明確使用 --all 選項列出全部單元(包括:直接引用的單元、出於依賴關係而被引用的單元、活動的單元、失敗的單元), 否則默認僅列出:活動的單元、失敗的單元、正處於任務隊列中的單元。 如果給出了模式(PATTERN)參數,那麼表示該命令僅作用於單元名稱與至少一個模式相匹配的單元。 還可以通過 --type=--state= 選項過濾要列出的單元。

這是默認命令。

list-sockets [PATTERN...]

列出已加載的套接字(socket)單元,並按照監聽地址排序。 如果給出了模式(PATTERN)參數,那麼表示該命令僅作用於單元名稱與至少一個模式相匹配的單元。 該命令的輸出大致像下面這樣子:

LISTEN           UNIT                        ACTIVATES
/dev/initctl     systemd-initctl.socket      systemd-initctl.service
...
[::]:22          sshd.socket                 sshd.service
kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
5 sockets listed.

注意:因爲監聽地址中有可能包含空格, 所以不適合使用程序分析該命令的輸出。

參見 --show-types, --all, --state= 選項。

list-timers [PATTERN...]

列出已加載的定時器(timer)單元,並按照下次執行的時間點排序。 如果給出了模式(PATTERN)參數,那麼表示該命令僅作用於單元名稱與至少一個模式相匹配的單元。

參見 --all--state= 選項。

start PATTERN...

啓動(activate)指定的已加載單元(無法啓動未加載的單元)。

如果某個單元未被啓動,又沒有處於失敗(failed)狀態, 那麼通常是因爲該單元沒有被加載,所以根本沒有被模式匹配到。 此外,對於從模板實例化而來的單元,因爲 systemd 會在其尚未啓動前忽略它們, 又因爲模式(PATTERN)參數僅能匹配已加載單元的"主名稱"(不含單元的"別名"), 所以,在這個命令中使用包含通配符的模式並沒有多少實際意義。

stop PATTERN...

停止(deactivate)指定的單元

reload PATTERN...

要求指定的單元重新加載它們的配置。 注意,這裏所說的"配置"是服務進程專屬的配置(例如 httpd.conf 之類), 而不是 systemd 的"單元文件"。 如果你想重新加載 systemd 的"單元文件", 那麼應該使用 daemon-reload 命令。 以 Apache 爲例, 該命令會導致重新加載 httpd.conf 文件, 而不是 apache.service 文件。

不要將此命令與 daemon-reload 命令混淆。

restart PATTERN...

重新啓動指定的單元。 若指定的單元尚未啓動,則啓動它們。

try-restart PATTERN...

重新啓動指定的已啓動單元。 注意,若指定的單元尚未啓動,則不做任何操作。

reload-or-restart PATTERN...

首先嚐試重新加載指定單元的進程專屬配置, 對於那些加載失敗的單元,再繼續嘗試重新啓動它們。 若指定的單元尚未啓動,則啓動它們。

try-reload-or-restart PATTERN...

首先嚐試重新加載指定單元的進程專屬配置, 對於那些加載失敗的單元,再繼續嘗試重新啓動它們。 注意,若指定的單元尚未啓動,則不做任何操作。

isolate NAME

啓動指定的單元以及所有依賴單元,同時停止所有其他單元。 如果沒有給出單元的後綴名, 那麼相當於以 ".target" 作爲後綴名。

這類似於傳統上切換SysV運行級的概念。 該命令會立即停止所有在新目標單元中不需要的進程, 這其中可能包括當前正在運行的圖形環境以及正在使用的終端。

注意,該命令僅可用於 AllowIsolate=yes 的單元。參見 systemd.unit(5) 手冊。

kill PATTERN...

向指定單元的 --kill-who= 進程發送 --signal= 信號。

is-active PATTERN...

檢查指定的單元中,是否有處於活動(active)狀態的單元。 如果存在至少一個處於活動(active)狀態的單元,那麼返回"0"值,否則返回非零值。 除非同時使用了 --quiet 選項, 否則,此命令還會在標準輸出上顯示單元的狀態。

is-failed PATTERN...

檢查指定的單元中,是否有處於失敗(failed)狀態的單元。 如果存在至少一個處於失敗(failed)狀態的單元,那麼返回"0"值,否則返回非零值。 除非同時使用了 --quiet 選項, 否則,此命令還會在標準輸出上顯示單元的狀態。

status [PATTERN...|PID...]

如果指定了單元,那麼顯示指定單元的運行時狀態信息,以及這些單元最近的日誌數據。 如果指定了PID,那麼顯示指定PID所屬單元的運行時狀態信息,以及這些單元最近的日誌數據。 如果未指定任何單元或PID,那麼顯示整個系統的狀態信息, 此時若與 --all 連用, 則同時顯示所有已加載單元(可以用 -t 限定單元類型)的狀態信息。

此命令用於輸出人類易讀的結果,不要將其用於程序分析(應該使用 show 命令)。 除非使用了 --lines--full 選項, 否則默認只輸出10行日誌, 並且超長的部分會被省略號截斷。此外, journalctl --unit=NAMEjournalctl --user-unit=NAME 也會對超長的消息使用類似的省略號截斷。

show [PATTERN...|JOB...]

以"屬性=值"的格式顯示指定單元或任務的所有屬性。 單元用其名稱表示,而任務則用其id表示。 如果沒有指定任何單元或任務, 那麼顯示管理器(systemd)自身的屬性。 除非使用了 --all 選項, 否則默認不顯示屬性值爲空的屬性。 可以使用 --property= 選項限定僅顯示特定的屬性。 此命令的輸出適合用於程序分析, 而不適合被人類閱讀(應該使用 status 命令)。

cat PATTERN...

顯示指定單元的單元文件內容。 在顯示每個單元文件的內容之前, 會額外顯示一行單元文件的絕對路徑。

set-property NAME ASSIGNMENT...

在運行時修改單元的屬性值。 主要用於修改單元的資源控制屬性值而無需直接修改單元文件。 並非所有屬性都可以在運行時被修改, 但大多數資源控制屬性(參見 systemd.resource-control(5))可以。 所作修改會立即生效,並永久保存在磁盤上,以確保永遠有效。 但是如果使用了 --runtime 選項, 那麼此修改僅臨時有效,下次重啓此單元后,將會恢復到原有的設置。 設置屬性的語法與單元文件中的寫法相同。

例如: systemctl set-property foobar.service CPUShares=777

注意,此命令可以同時修改多個屬性值, 只需依次將各個屬性用空格分隔即可。

與單元文件中的規則相同, 設爲空表示清空當前已存在的列表。

help PATTERN...|PID...

顯示指定單元的手冊頁(若存在)。 指定PID表示顯示該進程所屬單元的手冊頁(若存在)。

reset-failed [PATTERN...]

重置指定單元的失敗(failed)狀態。 如果未指定任何單元,則重置所有單元的失敗(failed)狀態。 當某個單元因爲某種原因操作失敗(例如退出狀態碼不爲零或進程被強制殺死或啓動超時), 將會自動進入失敗(failed)狀態, 退出狀態碼與導致故障的原因 將被記錄到日誌中以方便日後排查。

list-dependencies [NAME]

顯示單元的依賴關係。 也就是顯示由 Requires=, Requisite=, ConsistsOf=, Wants=, BindsTo= 所形成的依賴關係。 如果沒有明確指定單元的名稱, 那麼表示顯示 default.target 的依賴關係樹。

默認情況下,僅以遞歸方式顯示 target 單元的依賴關係樹,而對於其他類型的單元,僅顯示一層依賴關係(不遞歸)。 但如果使用了 --all 選項, 那麼將對所有類型的單元都強制遞歸的顯示完整的依賴關係樹。

還可以使用 --reverse, --after, --before 選項指定僅顯示特定類型的依賴關係。

單元文件命令

list-unit-files [PATTERN...]
列出所有已安裝的單元文件及其啓用狀態(相當於同時使用了 is-enabled 命令)。 如果給出了模式(PATTERN)參數, 那麼表示該命令僅作用於單元文件名稱與至少一個模式相匹配的單元(僅匹配文件名,不匹配路徑)。

enable NAME..., enable PATH...

啓用指定的單元或單元實例(多數時候相當於將這些單元設爲"開機時自動啓動"或"插入某個硬件時自動啓動")。 這將會按照單元文件中 "[Install]" 小節的指示, 在例如 /etc/systemd/system/multi-user.target.wants/ 這樣的目錄中,創建指向單元文件自身的軟鏈接。 創建完軟連接之後,systemd 將會自動重新加載自身的配置(相當於執行 daemon-reload 命令),以確保所做的變更立即生效。 注意,除非同時使用了 --now 選項(相當於同時執行 start 命令), 否則啓用一個單元並不會導致該單元被啓動。 注意,對於形如 foo@bar.service 這樣的單元實例, 軟鏈接自身的文件名是實例化之後的單元名稱, 但是軟連接所指向的目標文件則是該單元的模板文件。

如果此命令的參數是一個有效的單元名稱(NAME),那麼將自動搜索所有單元目錄。 如果此命令的參數是一個單元文件的絕對路徑(PATH),那麼將直接使用指定的單元文件。 如果參數是一個位於標準單元目錄之外的單元文件, 那麼將會在標準單元目錄中額外創建一個指向此單元文件的軟連接, 以確保該單元文件能夠被 start 之類的命令找到。

除非使用了 --quiet 選項, 否則此命令還會顯示對文件系統所執行的操作(Created symlink ...)。

此命令是維護 .{wants,requires}/ 目錄與單元別名的首選方法。 注意,此命令僅會按照單元文件中 "[Install]" 小節預設的名稱創建軟鏈接。 另一方面,系統管理員亦可手動創建所需的軟鏈接, 特別是在需要創建不同於默認軟鏈接名稱的時候。 不過需要注意的是,系統管理員必須在創建完軟連接之後手動執行 daemon-reload 命令, 以確保所做的變更立即生效。

不要將此命令與 start 命令混淆,它們是相互獨立的命令: 可以啓動一個尚未啓用的單元,也可以啓用一個尚未啓動的單元。 enable 命令只是設置了單元的啓動鉤子(通過創建軟鏈接), 例如在系統啓動時或者某個硬件插入時,自動啓動某個單元。 而 start 命令則是具體執行單元的啓動操作, 例如對於服務單元來說就是啓動守護進程,而對於套接字單元來說則是綁定套接字,等等。

若與 --user 選項連用,則表示變更僅作用於用戶實例,否則默認作用於系統實例(相當於使用 --system 選項)。 若與 --runtime 選項連用,則表示僅作臨時性變更(重啓後所有變更都將丟失),否則默認爲永久性變更。 若與 --global 選項連用,則表示變更作用於所有用戶(在全局用戶單元目錄上操作),否則默認僅作用於當前用戶(在私有用戶單元目錄上操作)。 注意,當與 --runtime 選項連用時,systemd 守護進程不會重新加載自身的配置。

不可將此命令應用於已被 mask 命令屏蔽的單元,否則將會導致錯誤。

disable NAME...

停用指定的單元或單元實例(多數時候相當於撤銷這些單元的"開機時自動啓動"以及"插入某個硬件時自動啓動")。 這將會從單元目錄中刪除所有指向單元自身及所有支持單元的軟鏈接。 這相當於撤銷 enablelink 命令所做的操作。 注意,此命令會刪除所有指向單元自身及所有支持單元的軟鏈接, 包括手動創建的軟連接以及通過 enablelink 命令創建的軟連接。 注意,雖然 disableenable 是一對相反的命令,但是它們的效果並不一定總是完全對稱的。 因爲 disable 刪除的軟連接數量有可能比上一次 enable 命令創建的軟連接數量更多。

此命令的參數僅能接受單元的名字,而不能接受單元文件的路徑。

除了停用參數中明確指定的單元之外,那些在被停用單元 "[Install]" 小節的 Also= 選項中列出的所有單元,也同樣會被停用。 也就是說,這個停用動作是沿着 Also= 選項不斷傳遞的。

刪除完軟連接之後, systemd 將會自動重新加載自身的配置(相當於執行 daemon-reload 命令),以確保所做的變更立即生效。 注意,除非同時使用了 --now 選項(相當於同時執行 stop 命令), 否則停用一個單元並不會導致該單元被停止。

除非使用了 --quiet 選項, 否則此命令還會顯示對文件系統所執行的操作(Removed symlink ...)。

有關 --system, --user, --runtime, --global 選項的影響,參見上面對 enable 命令的解釋。

reenable NAME...

重新啓用指定的單元或單元實例。 這相當於先使用 disable 命令之後再使用 enable 命令。 通常用於按照單元文件中 "[Install]" 小節的指示重置軟鏈接名稱。 此命令的參數僅能接受單元的名字,而不能接受單元文件的路徑。

preset NAME...

按照預設文件(*.preset)的指示,重置指定單元的啓用(enable)/停用(disable)狀態。 其效果等價於按照預設規則,對列出的單元依次使用 disableenable 命令。

可以使用 --preset-mode= 選項控制如何參照預設文件: 既啓用又停用、僅啓用、僅停用

如果指定單元的 "[Install]" 小節不包含必要的啓用信息, 那麼此命令將會悄無聲息的忽略該單元。

有關預設文件的更多說明,詳見 systemd.preset(5) 手冊與 Preset[1] 文檔。

preset-all

按照預設文件(*.preset)的指示, 重置全部單元的啓用(enable)/停用(disable)狀態(參見上文)。

可以使用 --preset-mode= 選項控制如何參照預設文件: 既啓用又停用、僅啓用、僅停用

is-enabled NAME...

檢查是否有至少一個指定的單元或單元實例已經被啓用。如果有,那麼返回"0",否則返回非零。 除非使用了 --quiet 選項,否則此命令還會顯示指定的單元或單元實例的當前啓用狀態:

Table 1. is-enabled 命令的輸出

狀態 含義 返回值
"enabled" 已經通過 /etc/systemd/system/*.{wants,requires}/ 目錄下的軟連接被永久啓用 0
"enabled-runtime" 已經通過 /run/systemd/system/*.{wants,requires}/ 目錄下的軟連接被臨時啓用 0
"linked" 雖然單元文件本身不在標準單元目錄中,但是指向此單元文件的一個或多個軟連接已經存在於 /etc/systemd/system/ 永久目錄中 > 0
"linked-runtime" 雖然單元文件本身不在標準單元目錄中,但是指向此單元文件的一個或多個軟連接已經存在於 /run/systemd/system/ 臨時目錄中 > 0
"masked" 已經被 /etc/systemd/system/ 目錄永久屏蔽(軟連接指向 /dev/null 文件),因此 start 操作會失敗 > 0
"masked-runtime" 已經被 /run/systemd/systemd/ 目錄臨時屏蔽(軟連接指向 /dev/null 文件),因此 start 操作會失敗 > 0
"static" 尚未被啓用,並且單元文件的 "[Install]" 小節中沒有可用於 enable 命令的選項 0
"indirect" 尚未被啓用,但是單元文件的 "[Install]" 小節中 Also= 選項的值列表非空(也就是列表中的某些單元可能已被啓用) 0
"disabled" 尚未被啓用,但是單元文件的 "[Install]" 小節中存在可用於 enable 命令的選項 > 0
"generated" 單元文件是被單元生成器動態生成的(參見 systemd.generator(7) 手冊)。被生成的單元文件可能並未被直接啓用,而是被單元生成器隱含的啓用了。 0
"transient" 單元文件是被運行時API動態臨時生成的。該臨時單元可能並未被啓用。 0
"bad" 單元文件不正確或者出現其他錯誤。 is-enabled 不會返回此狀態,而是會顯示一條出錯信息。 list-unit-files 命令有可能會顯示此單元。 > 0

mask NAME...

屏蔽指定的單元或單元實例。 也就是在單元目錄中創建指向 /dev/null 的同名符號連接,從而在根本上確保無法啓動這些單元。 這比 disable 命令更徹底,可以通殺一切啓動方法(包括手動啓動),所以應該謹慎使用該命令。 若與 --runtime 選項連用,則表示僅作臨時性屏蔽(重啓後屏蔽將失效),否則默認爲永久性屏蔽。 除非使用了 --now 選項(相當於同時執行 stop 命令),否則僅屏蔽一個單元並不會導致該單元被停止。 此命令的參數僅能接受單元的名字,而不能接受單元文件的路徑。

unmask NAME...

解除對指定單元或單元實例的屏蔽,這是 mask 命令的反動作。 也就是在單元目錄中刪除指向 /dev/null 的同名符號連接。 此命令的參數僅能接受單元的名字,而不能接受單元文件的路徑。

link PATH...

將不在標準單元目錄中的單元文件(通過軟鏈接)連接到標準單元目錄中去。 PATH 參數必須是單元文件的絕對路徑。該命令的結果可以通過 disable 命令撤消。 通過該命令,可以讓一個不在標準單元目錄中的單元文件,也可以像位於標準單元目錄中的常規單元文件一樣, 被 start, stop ... 等各種命令操作。

revert NAME...

將指定的單元恢復成初始版本。 這將會刪除對指定單元的所有修改。 例如,對於 "foo.service" 單元來說, 將會刪除所有 foo.service.d/ 目錄。 如果指定的單元在 /usr/lib/ 目錄中 還存在單元文件的初始版本,那麼還會進一步刪除 /etc/ 與 /run/ 目錄中 所有用來覆蓋初始單元文件的軟連接與自定義單元文件。 如果指定的單元已經被屏蔽,那麼將會被解除屏蔽。

從效果上看,該命令相當於撤銷 edit, set-property, mask 命令所做的操作, 並且將指定單元的配置恢復成軟件包提供的初始值。

add-wants TARGET NAME..., add-requires TARGET NAME...

將指定的單元或單元實例(NAME) 作爲 "Wants=" 或 "Requires=" 依賴, 添加到 TARGET 單元中。

關於 --system, --user, --runtime, --global 選項的影響, 參見前文對 enable 命令的解釋。

edit NAME...

調用文本編輯器(參見下面的"環境變量"小節)修改指定的單元或單元實例。

若使用了 --full 選項,則表示使用新編輯的單元文件完全取代原始單元文件, 否則默認將新編輯的單元配置片段(位於 .d/ 目錄)附加到原始單元文件的末尾。

如果使用了 --force 選項,並且某些指定的單元文件不存在, 那麼將會強制打開一個新的空單元文件以供編輯。

注意,在編輯過程中,編輯器實際操作的只是臨時文件, 僅在編輯器正常退出時,臨時文件的內容纔會被實際寫入到目標文件中。

注意,如果在編輯器退出時,臨時文件的內容爲空, 則表示取消編輯動作(而不是寫入一個空文件)。

編輯動作完成之後,systemd 將會自動重新加載自身的配置(相當於執行 daemon-reload 命令),以確保所做的變更立即生效。

關於 --system, --user, --runtime, --global 選項的影響, 參見前文對 enable 命令的解釋。

注意:(1)該命令不可用於編輯遠程主機上的單元文件。 (2)禁止在編輯 /etc 中的原始單元文件時使用 --runtime 選項, 因爲 /etc 中的單元文件優先級高於 /run 中的單元文件。

get-default

顯示默認的啓動目標。 這將顯示 default.target 軟鏈接所指向的實際單元文件的名稱。

set-default NAME

設置默認的啓動目標。 這會將 default.target 軟鏈接指向 NAME 單元。

機器命令

list-machines [PATTERN...]
列出主機和所有運行中的本地容器,以及它們的狀態。 如果給出了模式(PATTERN)參數, 那麼僅顯示容器名稱與至少一個模式匹配的本地容器。

任務(job)命令

list-jobs [PATTERN...]
列出正在運行中的任務。 如果給出了模式(PATTERN)參數, 那麼僅顯示單元名稱與至少一個模式匹配的任務。

cancel JOB...

據給定的任務ID撤消任務。 如果沒有給出任務ID, 那麼表示撤消所有尚未執行的任務。

環境變量命令

show-environment
顯示所有 systemd 環境變量及其值。 顯示格式遵守shell腳本語法,可以直接用於shell腳本中。 這些環境變量會被傳遞給所有由 systemd 派生的進程。

set-environment VARIABLE=VALUE...

設置指定的 systemd 環境變量。

unset-environment VARIABLE...

撤消指定的 systemd 環境變量。 如果僅指定了變量名,那麼表示無條件的撤消該變量(無論其值是什麼)。 如果以 VARIABLE=VALUE 格式同時給出了變量值, 那麼表示僅當 VARIABLE 的值恰好等於 VALUE 時, 才撤消 VARIABLE 變量。

import-environment [VARIABLE...]

導入指定的客戶端環境變量。 如果未指定任何參數, 則表示導入全部客戶端環境變量。

systemd 生命週期命令

daemon-reload
重新加載 systemd 守護進程的配置。 具體是指:重新運行所有的生成器(systemd.generator(7)), 重新加載所有單元文件,重建整個依賴關係樹。 在重新加載過程中, 所有由 systemd 代爲監聽的用戶套接字都始終保持可訪問狀態。

不要將此命令與 reload 命令混淆。

daemon-reexec

重新執行 systemd 守護進程。 具體是指:首先序列化 systemd 狀態, 接着重新執行 systemd 守護進程並反序列化原有狀態。 此命令僅供調試和升級 systemd 使用。 有時候也作爲 daemon-reload 命令的重量級版本使用。 在重新執行過程中, 所有由 systemd 代爲監聽的用戶套接字都始終保持可訪問狀態。

系統命令

is-system-running
檢查當前系統是否處於正常運行狀態(running),若正常則返回"0",否則返回大於零的正整數。 所謂正常運行狀態是指: 系統完成了全部的啓動操作,整個系統已經處於完全可用的狀態, 特別是沒有處於啓動/關閉/維護狀態,並且沒有任何單元處於失敗(failed)狀態。 除非使用了 --quiet 選項, 否則此命令還會在標準輸出上顯示系統的當前狀態, 如下表所示:

Table 2. is-system-running 命令的輸出

狀態 含義 返回值
initializing 啓動的早期階段。也就是尚未到達 basic.target/rescue.target/emergency.target 之前的階段。 > 0
starting 啓動的晚期階段。 也就是任務隊列首次達到空閒之前的階段, 或者已經啓動到了某個救援 target 中。 > 0
running 完成了全部的啓動操作,整個系統已經處於完全可用的狀態, 並且沒有任何單元處於失敗(failed)狀態。 0
degraded 完成了全部的啓動操作,系統已經可用, 但是某些單元處於失敗(failed)狀態。 > 0
maintenance 啓動了 rescue.target/emergency.target 目標。 > 0
stopping 系統正處於關閉過程中。 > 0
offline 整個系統已經處於完全可用的狀態, 但init進程(PID=1)不是 systemd > 0
unknown 由於資源不足或未知原因, 無法檢測系統的當前狀態 > 0

default

進入默認模式。差不多相當於執行 isolate default.target 命令。

rescue

進入救援模式。差不多相當於執行 isolate rescue.target 命令。 但同時會向所有用戶顯示一條警告信息。

emergency

進入緊急維修模式。差不多相當於執行 isolate emergency.target 命令。 但同時會向所有用戶顯示一條警告信息。

halt

關閉系統,但不切斷電源。 差不多相當於執行 start halt.target --job-mode=replace-irreversibly 命令。 但同時會向所有用戶顯示一條警告信息。 若僅使用一次 --force 選項,則跳過單元的正常停止步驟而直接殺死所有進程,強制卸載所有文件系統(或以只讀模式重新掛載),並立即關閉系統。 若使用了兩次 --force 選項,則跳過殺死進程和卸載文件系統的步驟,並立即關閉系統,這會導致數據丟失、文件系統不一致等不良後果。 注意,如果連續兩次使用 --force 選項, 那麼所有操作都將由 systemctl 自己直接執行,而不會與 systemd 進程通信。 這意味着,即使 systemd 進程已經僵死或者崩潰, 連續兩次使用 --force 選項所指定的操作依然能夠執行成功。

poweroff

關閉系統,同時切斷電源。 差不多相當於執行 start poweroff.target --job-mode=replace-irreversibly 命令。 但同時會向所有用戶顯示一條警告信息。 若僅使用一次 --force 選項,則跳過單元的正常停止步驟而直接殺死所有進程,強制卸載所有文件系統(或以只讀模式重新掛載),並立即關閉系統。 若使用了兩次 --force 選項,則跳過殺死進程和卸載文件系統的步驟,並立即關閉系統,這會導致數據丟失、文件系統不一致等不良後果。 注意,如果連續兩次使用 --force 選項, 那麼所有操作都將由 systemctl 自己直接執行,而不會與 systemd 進程通信。 這意味着,即使 systemd 進程已經僵死或者崩潰, 連續兩次使用 --force 選項所指定的操作依然能夠執行成功。

reboot [arg]

關閉系統,然後重新啓動。 差不多相當於執行 start reboot.target --job-mode=replace-irreversibly 命令。 但同時會向所有用戶顯示一條警告信息。 若僅使用一次 --force 選項,則跳過單元的正常停止步驟而直接殺死所有進程,強制卸載所有文件系統(或以只讀模式重新掛載),並立即關閉系統。 若使用了兩次 --force 選項,則跳過殺死進程和卸載文件系統的步驟,並立即關閉系統,這會導致數據丟失、文件系統不一致等不良後果。 注意,如果連續兩次使用 --force 選項, 那麼所有操作都將由 systemctl 自己直接執行,而不會與 systemd 進程通信。 這意味着,即使 systemd 進程已經僵死或者崩潰, 連續兩次使用 --force 選項所指定的操作依然能夠執行成功。

若給出了可選的 arg 參數, 那麼將會被作爲可選參數傳遞給 reboot(2) 系統調用。 其取值範圍依賴於特定的硬件平臺。 例如 "recovery" 有可能表示觸發系統恢復動作, 而 "fota" 有可能表示 “firmware over the air” 固件更新。

kexec

關閉系統,並通過內核的 kexec 接口重新啓動。 差不多相當於執行 start kexec.target --job-mode=replace-irreversibly 命令。 但同時會向所有用戶顯示一條警告信息。 若使用了 --force 選項, 則跳過服務的正常關閉步驟而直接殺死所有進程, 強制卸載所有文件系統(或只讀掛載), 並立即關閉系統。

exit [EXIT_CODE]

讓 systemd 按照指定的 EXIT_CODE 退出碼(必須是整數)退出。 若未指定 EXIT_CODE 則退出碼爲零。

此命令相當於 poweroff 命令, 但僅可用於用戶實例(也就是以 --user 選項啓動的實例)或容器, 否則會執行失敗。

switch-root ROOT [INIT]

將系統的根目錄切換到 ROOT 並執行新的 INIT 程序(PID=1)。 此命令僅應該在初始內存盤("initrd")中使用。 如果未指定 INIT 參數, 那麼表示自動在 ROOT 目錄下搜索 systemd 二進制程序, 並用作 INIT 程序, 同時"initrd"中 systemd 的狀態將會傳遞給新的 systemd 進程, 從而允許在新系統中對原"initrd"中的各種服務狀態進行內省。

suspend

休眠到內存。 相當於啓動 suspend.target 目標。

hibernate

休眠到硬盤。 相當於啓動 hibernate.target 目標。

hybrid-sleep

進入混合休眠模式。 也就是同時休眠到內存和硬盤。 相當於啓動 hybrid-sleep.target 目標。

參數語法

單元命令的參數可能是一個單獨的單元名稱(NAME), 也可能是多個匹配模式(PATTERN...)。 對於第一種情況,如果省略單元名稱的後綴,那麼默認以 ".service" 爲後綴, 除非那個命令只能用於某種特定類型的單元。例如

# systemctl start sshd

等價於

# systemctl start sshd.service

, 而

# systemctl isolate default

等價於

# systemctl isolate default.target

,因爲 isolate 命令只能用於 .target 單元。 注意,設備文件路徑(絕對路徑)會自動轉化爲 device 單元名稱,其他路徑(絕對路徑)會自動轉化爲 mount 單元名稱。 例如,如下命令

# systemctl status /dev/sda
# systemctl status /home

分別等價於

# systemctl status dev-sda.device
# systemctl status home.mount

對於第二種情況,可以在模式中使用shell風格的匹配符,對所有已加載單元的主名稱(primary name)進行匹配。 如果沒有使用匹配符並且省略了單元后綴,那麼處理方式與第一種情況完全相同。 這就意味着:如果沒有使用匹配符,那麼該模式就等價於一個單獨的單元名稱(NAME),只表示一個明確的單元。 如果使用了匹配符,那麼該模式就可以匹配任意數量的單元(包括零個)。

模式使用 fnmatch(3) 語法, 也就是可以使用shell風格的 "*", "?", "[]" 匹配符(詳見 glob(7))。 模式將基於所有已加載單元的主名稱(primary name)進行匹配, 如果某個模式未能匹配到任何單元,那麼將會被悄無聲息的忽略掉。 例如

# systemctl stop sshd@*.service

命令將會停止所有 sshd@.service 的實例單元。 注意,單元的別名(軟連接)以及未被加載的單元,不在匹配範圍內(也就是不作爲匹配目標)。

對於單元文件命令,NAME 參數必須是單元名稱(完整的全稱或省略了後綴的簡稱)或單元文件的絕對路徑。 例如:

# systemctl enable foo.service

# systemctl link /path/to/foo.service

退出狀態

返回值爲 0 表示成功, 非零返回值表示失敗代碼。

環境變量

$SYSTEMD_EDITOR
編輯單元文件時所使用的編輯器,會覆蓋 $EDITOR$VISUAL 的值。 如果 $SYSTEMD_EDITOR, $EDITOR, $VISUAL 都不存在或無法使用, 那麼將會依次嘗試使用 editor(1), nano(1), vim(1), vi(1) 編輯器。

$SYSTEMD_PAGER

指定分頁程序。僅在未指定 --no-pager 選項時有意義。 此變量會覆蓋 $PAGER 的值。 將此變量設爲空字符串或 "cat" 等價於使用 --no-pager 選項。

$SYSTEMD_LESS

用於覆蓋 默認傳遞給 less 程序的命令行選項 ("FRSXMK")。

參見

systemd(1), journalctl(1), loginctl(1), machinectl(1), systemd.unit(5), systemd.resource-control(5), systemd.special(7), wall(1), systemd.preset(5), systemd.generator(7), glob(7)

NOTES

1.
Preset

本頁面中文版由中文 man 手冊頁計劃提供。

翻譯人員:金步國
金步國作品集:http://www.jinbuguo.com
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

systemd 231