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 命令連用時， 表示同時還要啟動該單元。 當與 disable 或 mask 命令連用時， 表示同時還要停止該單元。

    --root=
        與 enable/disable/is-enabled 等相關命令連用，用於設定尋找單元檔案時的根目錄。

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

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

    --preset-mode=
        與 preset 或 preset-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=NAME 或 journalctl --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...
    停用指定的單元或單元例項(多數時候相當於撤銷這些單元的"開機時自動啟動"以及"插入某個硬體時自動啟動")。 這將會從單元目錄中刪除所有指向單元自身及所有支援單元的軟連結。 這相當於撤銷 enable 或 link 命令所做的操作。 注意，此命令會刪除所有指向單元自身及所有支援單元的軟連結， 包括手動建立的軟連線以及通過 enable 與 link 命令建立的軟連線。 注意，雖然 disable 與 enable 是一對相反的命令，但是它們的效果並不一定總是完全對稱的。 因為 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)狀態。 其效果等價於按照預設規則，對列出的單元依次使用 disable 或 enable 命令。

    可以使用 --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
    http://freedesktop.org/wiki/Software/systemd/Preset

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

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