天天看點

systemctl指令

systemctl指令

Systemd

是一個指令組,涉及到系統管理的方方面面,而

systemctl

Systemd

的主指令,用于管理系統。

描述

在曆史上

Linux

的啟動一直采用

init

程序,這種方法有兩個缺點,一是啟動時間長,

init

程序是串行啟動,隻有前一個程序啟動完,才會啟動下一個程序,二是啟動腳本複雜,

init

程序隻是執行啟動腳本,不管其他事情,腳本需要自己處理各種情況,這往往使得腳本變得很長。

Systemd

就是為了解決這些問題而誕生的,它的設計目标是,為系統的啟動和管理提供一套完整的解決方案,根據

Linux

慣例,字母

d

是守護程序

daemon

的縮寫,

Systemd

這個名字的含義,就是它要守護整個系統。使用了

Systemd

,就不需要再用

init

了,

Systemd

取代了

initd

,成為系統的第一個程序

PID

等于

1

,其他程序都是它的子程序,

Systemd

的優點是功能強大,使用友善,缺點是體系龐大,非常複雜,事實上,現在還有很多人反對使用

Systemd

,理由就是它過于複雜,與作業系統的其他部分強耦合,違反

keep simple, keep stupid

Unix

哲學。

文法

systemctl [OPTIONS...] {COMMAND} ...
           

參數

OPTIONS

  • -t, --type=

    : 參數應該是以逗号分隔的單元類型清單,例如

    service

    socket

    ,如果其中一個參數是機關類型,則在列出機關時,将顯示限制為某些機關類型,否則将顯示所有類型的機關,作為一種特殊情況,如果其中一個參數是

    help

    ,則将列印允許值的清單,程式将退出。
  • --state=

    : 參數應該是以逗号分隔的機關負載、子狀态或活動狀态清單,列出機關時,僅顯示處于指定狀态的機關。
  • -p, --property=

    : 使用

    show

    指令顯示

    unit/job/manager

    屬性時,将顯示限制為參數指定的某些屬性,如果未指定,則顯示所有集合屬性,參數應該是以逗号分隔的屬性名清單,例如

    MainPID

    ,如果多次指定,将顯示具有指定名稱的所有屬性。
  • -a, --all

    : 列出機關時,請顯示所有加載的機關,無論其狀态如何,包括不活動的機關,顯示

    unit/job/manager

    屬性時,無論是否設定,都顯示所有屬性,要列出系統上安裝的所有單元,請改用

    list-unit-files

    指令。
  • -r, --recursive

    : 當列出機關時,還顯示本地容器的機關,本地容器的機關将以容器名稱為字首,并用單個冒号

    :

    分隔。
  • --reverse

    : 顯示具有清單依賴性的單元之間的反向依賴性,即在給定單元上具有類型為

    Wants=

    Requires=

    的單元。
  • --after

    list-dependencies

    清單依賴項,顯示在指定機關之前排序的機關,換句話說,列出在指定單元的

    After=

    指令中的單元、在

    Before=

    指令中有指定單元的單元,或者是指定單元的隐式依賴項。
  • --before

    list-dependencies

    清單依賴項,顯示在指定機關之後排序的機關,換言之,列出在指定單元的

    Before=

    指令中、在

    After=

    指令中具有指定單元或以其他方式依賴于指定單元的單元。
  • -l, --full

    : 不省略狀态,即

    list-units

    清單單元、

    list-jobs

    清單作業和

    list-timers

    清單計時器的輸出中的單元名稱,

    process tree entries

    過程樹條目,

    journal output

    日志輸出或

    truncate unit descriptions

    截斷單元描述。
  • --show-types

    : 顯示套接字時,顯示套接字的類型。
  • --job-mode=

    : 将新作業排隊時,此選項控制如何處理已排隊的作業,它采用

    fail

    replace

    replace

    replace-irreversibly

    isolate

    ignore dependencies

    ignore requirements

    flush

    之一,預設為

    replace

    ,除非使用了表示隔離作業模式的

    isolate

    指令。如果指定了

    fail

    ,并且請求的操作與挂起的作業沖突,更具體地說導緻已挂起的開始作業反轉為停止作業,反之亦然,則導緻操作失敗。如果指定了

    replace

    預設值,則将根據需要替換任何沖突的挂起作業。如果指定了

    replace-irreversibly

    ,則按

    replace

    操作,但也要将新作業标記為不可逆,這可以防止将來發生沖突的事務替換這些作業,甚至在不可逆作業仍挂起時排隊,仍然可以使用

    cancel

    指令取消不可逆的作業。

    isolate

    僅對啟動操作有效,并在啟動指定單元時導緻所有其他單元停止。使用隔離指令時,始終使用此模式。

    flush

    将導緻在新作業排隊時取消所有排隊作業。如果指定了

    ignore-dependencies

    ,那麼将忽略此新作業的所有單元依賴項,并立即執行該操作,如果通過,則不會引入所通過單元的任何必需單元,并且不會遵循任何排序依賴關系,這主要是管理者的調試和救援工具,不應該被應用程式使用。

    ignore-requirements

    ignore-dependencies

    類似,但隻會導緻忽略需求依賴項,排序依賴項仍将得到滿足。
  • -i, --ignore-inhibitors

    : 當系統關閉或請求睡眠狀态時,忽略抑制器鎖,應用程式可以建立抑制器鎖,以避免某些重要操作如

    CD

    刻錄等被系統關閉或睡眠狀态中斷,任何使用者都可以使用這些鎖,特權使用者可以重寫這些鎖,如果使用任何鎖,關機和睡眠狀态請求通常會失敗無論是否具有特權,并列印活動鎖的清單,但是如果指定了

    --ignore inhibitors

    ,則會忽略鎖而不列印,并且無論如何都會嘗試該操作,可能需要額外的權限。
  • -q, --quiet

    : 禁止

    snapshot

    is-active

    is-failed

    is-enabled

    is-system-running

    enable

    disable

    的輸出為标準輸出。
  • --no-block

    : 不要同步等待請求的操作完成,如果未指定,則将驗證作業,将其加入隊列,并且

    systemctl

    将等待直到完成,通過傳遞此參數,僅對其進行驗證和排隊。
  • --no-legend

    : 不列印圖例,即帶有提示的列标題和頁腳。
  • --user

    : 與主叫使用者的服務管理者傳遞資訊,而不是與系統的服務管理者聯系。
  • --system

    : 與系統的服務管理傳遞資訊,這是預設值。
  • --failed

    : 列出失敗狀态的單元,這等效于

    --state=failed

  • --no-wall

    : 停止,關閉電源,重新啟動之前,不發送

    wall message

  • --global

    : 當與

    enable

    disable

    一起使用時,對全局使用者配置目錄進行操作,進而全局地啟用或禁用所有使用者将來登入的單元檔案。
  • --no-reload

    enable

    disable

    一起使用時,不要在執行更改後隐式地重新加載守護程式配置。
  • --no-ask-password

    : 與

    start

    和相關指令一起使用時,禁用詢問密碼,背景服務可能需要輸入密碼或密碼短語字元串,例如解鎖系統硬碟或加密證書,除非指定了此選項并且指令是從終端調用的,否則

    systemctl

    将在終端上向使用者查詢必要的機密,使用此選項可關閉此行為,在這種情況下,必須通過其他方式例如圖形密碼代理提供密碼,否則服務可能會失敗,這還禁止查詢使用者以進行特權操作的身份驗證。
  • --kill-who=

    kill

    一起使用時,選擇要向哪個程序發送信号,必須是

    main

    control

    all

    中的一個,以選擇是僅終止主程序、控制程序還是終止單元的所有程序,單元的主要過程是定義其生命周期的過程,一個單元的控制過程是由管理者調用以引起其狀态變化的過程。例如由于服務單元的

    ExecStartPre=

    ExecStop=

    ExecReload=

    設定而啟動的所有程序都是控制程序,注意每個單元一次隻有一個控制過程,因為一次隻執行一個狀态更改,對于

    type=forking

    的服務,

    ExecStart=manager

    啟動的初始程序是一個控制程序,而最終由該程序派生的程序則被視為單元的主程序(如果可以确定的話),對于其他類型的服務單元,這是不同的,在這些服務單元中,

    ExecStart=

    的管理器分叉的程序始終是主程序本身,一個服務單元由零個或一個主程序、零個或一個控制程序以及任意數量的附加程序組成,然而并不是所有的單元類型都管理這些類型的流程,例如對于

    mount

    單元,定義了控制程序即

    /bin/mount

    /bin/umount

    的調用,但沒有定義主程序,如果省略,則預設為

    all

  • -s, --signal=

    kill

    一起使用時,選擇要發送到標明程序的信号,必須是衆所周知的信号說明符之一,如

    SIGTERM

    SIGINT

    SIGSTOP

    ,如果省略,則預設為

    SIGTERM

  • -f, --force

    enable

    一起使用時,覆寫任何現有的沖突符号連結,當與

    halt

    poweroff

    reboot

    kexec

    一起使用時,執行所選操作而不關閉所有單元,但是所有程序都将被強制終止,所有檔案系統都以隻讀方式解除安裝或重新裝載,是以這是一個要求立即重新開機的激烈但相對安全的選擇,如果為這些操作指定了

    --force

    兩次,它們将立即執行,而不會終止任何程序或解除安裝任何檔案系統,警告在這些操作中指定

    --force

    兩次可能會導緻資料丢失。
  • --root=

    enable/disable/is enabled

    和相關指令一起使用時,在查找機關檔案時使用備用根路徑。
  • --runtime

    enable

    disable

    和相關指令一起使用時,僅臨時進行更改,以便在下次重新啟動時丢失更改,這将産生這樣的效果,更改不是在

    /etc

    的子目錄中進行的,而是在

    /run

    中進行的,具有相同的即時效果,但是由于後者在重新啟動時丢失,是以更改也會丢失,類似地,當與

    set

    屬性一起使用時,僅臨時進行更改,以便在下次重新啟動時丢失更改。
  • --preset-mode=

    : 取

    full

    預設、

    enable only

    disable only

    之一,當與預設或預設所有指令一起使用時,控制是根據預設規則禁用和啟用單元,還是僅啟用或僅禁用單元。
  • -n, --lines=

    status

    一起使用時,控制要顯示的日志行數,從最近的行開始計算,接受一個正整數參數,預設為

    10

  • -o, --output=

    : 與狀态一起使用時,控制顯示的日記賬分錄的格式,有關可用選項,請參見

    journalctl

    ,預設為

    short

  • --plain

    list-dependencies

    清單依賴項一起使用時,輸出将列印為清單而不是樹。
  • -H, --host=

    : 遠端執行操作,指定要連接配接的主機名,或使用者名和主機名之間用

    @

    分隔,主機名的字尾可以是一個容器名,用

    :

    分隔,它直接連接配接到指定主機上的特定容器,這将使用

    SSH

    與遠端

    machinemanager

    執行個體通信,容器名稱可以用

    machinectl-H HOST

    枚舉。
  • -M, --machine=

    : 在本地容器上執行操作,指定要連接配接到的容器名稱。
  • -h, --help

    : 輸出幫助資訊。
  • --version

    : 輸出版本資訊。

Unit Commands

  • list-units [PATTERN...]

    : 列出已知機關,受

    -t

    規定的限制,如果指定了一個或多個模式,則隻顯示與其中一個模式比對的單元,這是預設

    PATTERN

  • list-sockets [PATTERN...]

    : 列出按偵聽位址排序的套接字單元。如果指定了一個或多個模式,則僅顯示與其中一個模式比對的套接字單元。
  • list-timers [PATTERN...]

    : 列出計時器機關,按它們下一次經過的時間排序,如果指定了一個或多個模式,則隻顯示與其中一個模式比對的單元。
  • start PATTERN...

    : 啟動(激活)指令行上指定的一個或多個單元,請注意全局模式在目前已加載的機關清單上運作,通常不處于活動狀态且未處于故障狀态的單元不會被加載,并且不會通過任何模式進行比對,另外在執行個體化單元的情況下,

    systemd

    通常在啟動執行個體之前才知道執行個體名稱,是以将

    glob

    模式與

    start

    一起使用具有有限的用途。
  • stop PATTERN...

    : 停止(停用)指令行上指定的一個或多個機關。
  • reload PATTERN...

    : 要求指令行上列出的所有機關重新加載其配置,請注意這将重新加載特定于服務的配置,而不是

    systemd

    的單元配置檔案,如果希望

    systemd

    重新加載單元的配置檔案,請使用

    daemon reload

    指令,例如對于

    Apache

    的示例,這将重新加載

    Apache

    httpd.conf

    檔案在

    web

    伺服器中,而不是

    apache.service

    服務系統機關檔案,此指令不應與守護程序重載或加載指令混淆。
  • restart PATTERN...

    : 重新啟動指令行中指定的一個或多個單元,如果這些單元還沒有運作,它們将被啟動。
  • try-restart PATTERN...

    : 如果一個或多個單元正在運作,則重新啟動指令行中指定的一個或多個單元,如果單元沒有運作,則不會執行任何操作,注意,為了與

    Red Hat init

    腳本相容,

    condrestart

    等價于這個指令。
  • reload-or-restart PATTERN...

    : 如果機關支援的話則重新加載,否則,重新啟動它們,如果這些單元還沒有運作,它們将被啟動。
  • reload-or-try-restart PATTERN...

    : 如果機關支援的話則重新加載,否則,重新啟動它們。如果這些單元沒有運作,這将不起任何作用,注意,為了與

    SysV init

    force reload

    相當于這個指令。
  • isolate NAME

    : 啟動指令行上指定的單元及其依賴項,并停止所有其他單元,這類似于在傳統的

    init

    系統中更改運作級别,

    isolate

    指令将立即停止新單元中未啟用的程序,可能包括目前使用的圖形環境或終端,請注意,這隻允許在啟用

    AllowIsolate=

    的單元上使用,詳情請參見

    systemd.unit

  • kill PATTERN...

    : 向裝置的一個或多個程序發送信号,使用

    --kill who=

    選擇要終止的程序,使用

    --signal=

    選擇要發送的信号。
  • is-active PATTERN...

    : 檢查是否有任何指定的單元處于活動狀态,即正在運作,如果至少有一個處于活動狀态,則傳回退出代碼0,否則傳回非零,除非指定

    --quiet

    ,否則這也會将目前機關狀态列印到标準輸出。
  • is-failed PATTERN...

    : 檢查指定的單元是否處于失敗狀态,如果至少有一個失敗,則傳回退出代碼 ,否則傳回非零,除非指定

    --quiet

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

    : 顯示關于一個或多個單元的簡要運作時狀态資訊,然後是來自日志的最新日志資料,如果未指定機關,則顯示系統狀态,如果與

    --all

    組合,也顯示所有單元的狀态(受

    -t

    指定的限制),如果傳入

    PID

    ,則顯示該程序所屬的單元資訊,這個函數的目的是生成人類可讀的輸出,如果您正在尋找計算機可解析的輸出,請使用

    show

    代替,預設情況下,這個函數隻顯示

    10

    行輸出和橢圓線以适應終端視窗,這可以用

    --lines

    --full

    來更改,此外

    journalctl --unit=NAME

    journalctl --user-unit=NAME

    對消息使用了類似的過濾器,可能更友善。
  • show [PATTERN...|JOB...]

    : 顯示一個或多個單元、作業或管理器本身的屬性,如果未指定參數,則将顯示管理器的屬性,預設情況下,将禁止空屬性。用

    --all

    的來顯示所有屬性,要選擇要顯示的特定屬性,請使用

    --property=

    ,此指令用于需要計算機可分析輸出時,如果要查找格式化的可讀輸出,請使用

    status

  • cat PATTERN...

    : 顯示一個或多個單元的備份檔案,列印單元的

    fragment

    drop-ins

    (源檔案),每個檔案前面都有一個注釋,其中包含檔案名。
  • set-property NAME ASSIGNMENT...

    : 在支援的運作時設定指定的單元屬性,這允許在運作時更改配置參數屬性,例如資源控制設定,并非所有屬性都可以在運作時更改,但許多資源控制設定

    systemd.resource-control

    可以,更改會立即應用,并存儲在磁盤上以備将來引導,除非傳遞了

    --runtime

    ,在這種情況下,設定隻應用到下一次重新啟動,屬性指派的文法與機關檔案中指派的文法非常相似。例如

    systemctl set-property foobar.service CPUShares=777

    ,請注意,此指令允許同時更改多個屬性,這比單獨設定屬性更好,與單元檔案配置設定一樣,将空清單指定給清單參數将重置清單。
  • help PATTERN...|PID...

    : 顯示一個或多個單元的手冊頁(如果可用),如果給定

    PID

    ,則會顯示流程所屬單元的手冊頁。
  • reset-failed [PATTERN...]

    : 重置指定單元的

    fail

    狀态,或者如果沒有傳遞單元名稱,則重置所有單元的狀态,當一個單元以某種方式發生故障(即程序帶非零錯誤代碼退出、異常終止或逾時)時,它将自動進入

    fail

    狀态,并記錄其退出代碼和狀态供管理者自查,直到使用此指令重新啟動或重設服務。
  • list-dependencies [NAME]

    : 顯示指定機關的所需機關和所需機關,如果沒有指定機關,目标機關會遞歸展開,當傳遞

    --all

    時,所有其他單元也會遞歸展開。

Unit File Commands

  • list-unit-files [PATTERN...]

    : 列出已安裝的單元檔案,如果指定了一個或多個模式,則隻顯示其檔案名(隻是路徑的最後一個元件)與其中一個比對的單元。
  • enable NAME...

    : 根據指令行上的指定,啟用一個或多個機關檔案或機關檔案執行個體,這将建立許多符号連結,這些符号連結編碼在單元檔案的

    [Install]

    部分,建立符号連結後,将重新加載

    systemd

    配置(以相當于

    daemon reload

    的方式),以確定立即考慮更改,請注意,這不會同時啟動任何啟用的單元。如果需要,必須為裝置調用單獨的啟動指令,另請注意,在啟用執行個體的情況下,将在安裝位置建立名為

    same as instances

    的符号連結,但是它們都指向相同的模闆單元檔案,此指令将列印執行的操作,這個輸出可以通過傳遞

    --quiet

    來抑制,請注意,此操作僅為單元建立建議的符号連結,雖然此指令是操作單元配置目錄的推薦方法,但管理者可以通過在目錄中放置或删除符号連結來手動進行其他更改,這對于建立與建議的預設安裝不同的配置特别有用,在這種情況下,管理者必須確定根據需要手動調用

    daemon reload

    ,以確定将更改考慮在内。啟動單元不應與啟動(激活)單元混淆,就像啟動指令所做的那樣,啟用和啟動裝置是正交的,裝置可以不啟動就啟用,也可以不啟動就啟動,啟用隻需将單元挂接到各種建議的位置,例如,這樣在引導時或插入特定類型的硬體時,單元就會自動啟動。啟動實際上會生成守護程序(對于服務單元),或者綁定套接字(對于套接字單元)等等。根據是否指定了

    --system

    --user

    --runtime

    --global

    ,這将為系統、僅為調用使用者、僅為系統的此引導、所有使用者的所有将來登入或僅為此引導啟用該單元,請注意,在最後一種情況下,不會重新加載

    systemd

    守護程式配置。
  • disable NAME...

    : 禁用一個或多個機關,這将從單元配置目錄中删除指向指定單元檔案的所有符号連結,進而撤消

    enable

    所做的更改,但是請注意,這将删除指向單元檔案的所有符号連結(即包括手動添加),而不僅僅是那些由

    enable

    實際建立的符号連結,在完成單元的禁用之後,此調用隐式地重新加載

    systemd

    守護程式配置,請注意,此指令不會隐式停止正在禁用的單元,如果需要這樣做,随後應執行一個額外的停止指令,此指令将列印執行的操作,這個輸出可以通過傳遞

    --quiet

    來抑制,這個指令以與

    enable

    類似的方式接受

    --system

    --user

    --runtime

    --global

  • is-enabled NAME...

    : 檢查是否啟用了任何指定的機關檔案(如啟用),如果至少啟用了一個,則傳回退出代碼 ,否則傳回非零,列印目前啟用狀态

    enabled

    enabled-runtime

    linked

    linked-runtime

    masked

    masked-runtime

    static

    disabled

    ,要禁止此輸出,請使用

    --quiet

  • reenable NAME...

    : 按指令行上的指定,重新啟用一個或多個機關檔案,這是

    disable

    enable

    的組合,用于将啟用單元的符号連結重置為單元檔案

    [Install]

    部分中配置的預設值。
  • preset NAME...

    : 将指令行中指定的一個或多個機關檔案重置為預設政策檔案中配置的預設值,這與

    disable

    enable

    具有相同的效果,具體取決于機關在預設檔案中的列出方式。使用

    --preset-mode=

    控制是啟用和禁用單元,還是僅啟用或僅禁用單元,有關預設政策格式的詳細資訊,請參閱

    systemd.preset

    ,有關預設概念的更多資訊,請參閱

    Presetm

    文檔。
  • preset-all

    : 将所有已安裝的單元檔案重置為預設政策檔案中配置的預設值,使用

    --preset mode=

    控制是啟用和禁用單元,還是僅啟用或僅禁用單元。
  • mask NAME...

    : 根據指令行上的指定,屏蔽一個或多個機關檔案,這将把這些單元連結到

    /dev/null

    ,使它們無法啟動,這是一個更強大的版本的禁用,因為它禁止各種激活的機關,包括手動激活,小心使用此選項,這允許

    --runtime

    選項在下次重新啟動系統之前臨時屏蔽。
  • link FILENAME...

    : 将不在機關檔案搜尋路徑中的機關檔案連結到機關檔案搜尋路徑,這需要到機關檔案的絕對路徑,使用

    disable

    可以撤消此操作的效果,此指令的效果是,機關檔案可用于

    start

    和其他指令,盡管它沒有直接安裝在機關搜尋路徑中。
  • get-default

    : 擷取通過

    default.target

    連結指定的預設目标。
  • set-default NAME

    : 設定預設目标啟動,指令将

    default.target

    連結到給定的機關。

Machine Commands

  • list-machines [PATTERN...]

    : 列出主機和所有運作的本地容器及其狀态,如果指定了一個或多個模式,則隻顯示與其中一個模式比對的容器。

Job Commands

  • list-jobs [PATTERN...]

    : 列出正在進行的作業,如果指定了一個或多個模式,則僅顯示與其中一個模式比對的單元的作業。
  • cancel JOB...

    : 取消指令行上由數字作業ID指定的一個或多個作業,如果未指定作業

    ID

    ,請取消所有挂起的作業。

Snapshot Commands

  • snapshot [NAME]

    : 建立快照,如果指定了快照名稱,則新快照将以該名稱命名,如果未指定任何名稱,則生成自動快照名稱,在這兩種情況下,所使用的快照名稱都列印到标準輸出,除非指定了

    --quiet

    ,快照是指

    systemd manager

    的已儲存狀态,它本身作為一個單元來實作,這個單元是用這個指令動态生成的,并且依賴于當時所有活動的單元,稍後,使用者可以使用快照單元上的隔離指令傳回到該狀态,快照僅用于儲存和還原正在運作或已停止的單元,它們不儲存

    /

    還原任何其他狀态,快照是動态的,在重新啟動時丢失。
  • delete PATTERN...

    : 删除之前用

    snapshot

    建立的快照。

Environment Commands

  • show-environment

    : 轉儲

    systemd manager

    環境塊,環境塊将以适合源代碼到

    shell

    腳本的直接形式轉儲,此環境塊将傳遞給管理器生成的所有程序。
  • set-environment VARIABLE=VALUE...

    : 按照指令行上的指定,設定一個或多個

    systemd manager

    環境變量。
  • unset-environment VARIABLE...

    : 取消設定一個或多個

    systemd manager

    環境變量,如果隻指定了變量名,則無論其值如何,都将删除該變量名,如果指定了一個變量和一個值,則僅當該變量具有指定的值時才會删除該變量。
  • import-environment VARIABLE...

    : 将客戶機上設定的所有、一個或多個環境變量導入

    systemd manager

    環境塊,如果沒有傳遞任何參數,則導入整個環境塊,否則,應傳遞一個或多個環境變量名的清單,然後将其用戶端值導入到管理器的環境塊中。

Manager Lifecycle Commands

  • daemon-reload

    : 重新加載

    systemd manager

    配置,這将重新加載所有單元檔案并重新建立整個依賴關系樹,在重新加載守護程序時,

    systemd

    代表使用者配置偵聽的所有套接字都将保持可通路狀态,此指令不應與

    load

    reload

    指令混淆。
  • daemon-reexec

    : 重新執行

    systemd manager

    ,這将序列化管理器狀态,重新執行程序并再次反序列化狀态,除了調試和包更新之外,這個指令沒有什麼用處,有時,作為一個重載守護程序,它可能會有所幫助,當守護程序被重新執行時,代表使用者配置偵聽的所有套接字

    systemd

    都将保持可通路狀态。

System Commands

  • is-system-running

    : 檢查系統是否正在運作,當系統完全啟動并運作時,傳回

    success

    ,這意味着不處于啟動、關閉或維護模式,否則傳回失敗,此外,目前狀态以短字元串形式列印到标準輸出,使用

    --quiet

    可以抑制此狀态字元串的輸出。
  • default

    : 進入預設模式,這主要等效于隔離

    default.target

  • rescue

    : 進入救援模式,這主要相當于隔離

    rescue.target

    ,但也會向所有使用者列印牆消息。
  • emergency

    : 進入緊急模式,這在大多數情況下等效于隔離

    Emergency.target

    ,但也會向所有使用者顯示隔離牆消息。
  • halt

    : 關閉并停止系統,這主要等效于啟動

    halt.target --irreversible

    ,但還會向所有使用者顯示一條牆消息,如果與

    --force

    結合使用,則将跳過所有正在運作的服務的關閉,但是将終止所有程序,并且将所有檔案系統解除安裝或以隻讀方式裝載,然後立即停止系統,如果兩次指定

    --force

    ,将立即執行該操作,而不會終止任何程序或解除安裝任何檔案系統,這可能會導緻資料丢失。
  • poweroff

    : 關閉并關閉系統電源,這主要等效于啟動

    poweroff.target --irreversible

    --force

    結合使用,将跳過所有正在運作的服務的關閉,但是将終止所有程序,并且将所有檔案系統解除安裝或以隻讀方式裝載,然後立即關閉電源,如果兩次指定

    --force

  • reboot [arg]

    : 關閉并重新啟動系統,這主要等同于啟動

    reboot.target --irreversible

    --force

    結合使用,将跳過所有正在運作的服務的關閉,但是将終止所有程序,并且将所有檔案系統解除安裝或以隻讀方式裝載,然後立即重新開機,如果兩次指定

    --force

    ,将立即執行該操作,而不會終止任何程序或解除安裝任何檔案系統,這可能會導緻資料丢失,如果給出了可選參數

    arg

    ,它将作為可選參數傳遞給

    reboot

    系統調用,該值是體系結構和固件特定的,例如,

    recovery

    可用于觸發系統恢複,而

    fota

    可用于觸發

    firmware over the air

    更新。
  • kexec

    : 通過

    kexec

    關閉并重新啟動系統,這主要等效于啟動

    kexec.target --irreversible

    --force

    結合使用,則将跳過所有正在運作的服務的關閉,但是将終止所有程序,并且将所有檔案系統解除安裝或以隻讀方式裝載,然後立即重新開機。
  • exit

    : 要求系統管理者退出,僅使用者服務管理器支援此功能,即與

    --user

    選項結合使用,否則将失敗。
  • suspend

    : 挂起系統,這将觸發特殊的

    suspend.target

    目标的激活。
  • hibernate

    : 休眠系統,這将觸發特殊的

    hibernate.target

  • hybrid-sleep

    : 休眠并挂起系統。這将觸發特殊的

    hybrid-sleep.target

  • switch-root ROOT [INIT]

    : 切換到另一個根目錄,并在其下執行新的系統管理器程序,這旨在用于初始

    RAM

    磁盤

    initrd

    ,并将從

    initrd

    的系統管理器程序,也稱為

    init

    程序,過渡到主系統管理器程序,該調用有兩個參數,要成為新根目錄的目錄,以及要在其下以

    PID 1

    執行的新系統管理器二進制檔案的路徑,如果省略後者或為空字元串,則将自動生成

    systemd

    二進制檔案搜尋并用作

    init

    ,如果省略了系統管理器路徑或等于空字元串,則将

    initrd

    的系統管理器程序的狀态傳遞給主系統管理器,這允許稍後對

    initrd

    引導中涉及的服務的狀态進行自查。

UNIT檔案配置

UNIT檔案類型

Unit

檔案統一了過去各種不同的系統資源配置格式,例如服務的啟動、停止、定時任務、裝置自動挂載、網絡配置、裝置配置、虛拟記憶體配置等,而

Systemd

通過不同的通過檔案的字尾名來區分這些配置檔案,

.service

檔案便是其中最常用的一種,下面是

Systemd

所支援的

12

Unit

檔案類型。

  • .automount

    : 用于控制自動挂載檔案系統,自動挂載即當某一目錄被通路時系統自動挂載該目錄,這類

    unit

    取代了傳統

    Linux

    系統的

    autofs

    相應功能。
  • .device

    : 對應

    /dev

    目錄下裝置,主要用于定義裝置之間的依賴關系。
  • .mount

    : 定義系統結構層次中的一個挂載點,可以替代過去的

    /etc/fstab

    配置檔案。
  • .path

    : 用于監控指定目錄變化,并觸發其他

    unit

    運作。
  • .scope

    : 這類

    unit

    檔案不是使用者建立的,而是

    Systemd

    運作時自己産生的,描述一些系統服務的分組資訊。
  • .service

    : 封裝守護程序的啟動、停止、重新開機和重載等操作,是最常見的一種

    unit

    類型。
  • .slice

    : 用于描述

    cgroup

    的一些資訊,極少使用到,一般使用者就忽略它吧。
  • .snapshot

    : 這種

    unit

    其實是

    systemctl snapshot

    指令建立的一個描述

    Systemd unit

    運作狀态的快照。
  • .socket

    : 監控系統或網際網路中的

    socket

    消息,用于實作基于網絡資料自動觸發服務啟動。
  • .swap

    : 定義一個用于做虛拟記憶體的交換分區。
  • .target

    : 用于對

    unit

    進行邏輯分組,引導其他

    unit

    的執行,它替代了

    SysV

    中運作級别的作用,并提供更靈活的基于特定裝置事件的啟動方式,例如

    multi-user.target

    相當于過去的運作級别

    5

    ,而

    bluetooth.target

    在有藍牙裝置接入時就會被觸發。
  • .timer

    : 封裝由

    system

    的裡面由時間觸發的動作, 替代了

    crontab

    的功能。

配置目錄

Unit

檔案按照

Systemd

約定,應該被放置在指定的

3

個系統目錄之一,這

3

個目錄是有優先級的,在下面指定的位置優先級依次遞減,是以在幾個目錄中有同名檔案的時候,隻有優先級最高的目錄裡的那個會被使用。

  • /etc/systemd/system

    : 系統或使用者提供的配置檔案。
  • /run/systemd/system

    : 軟體運作時生成的配置檔案。
  • /usr/lib/systemd/system

    : 系統或第三方軟體安裝時添加的配置檔案。

Service檔案字段

通常我們隻需要配置

.service

檔案即可,

.service

分為三個字元。

Unit段

這些配置中,除了

Description

外,都能夠被添加多次,例如

After

參數可以使用空格分隔指定所有值,也可以使用多個

After

參數,在每行參數中指定一個值。

  • Description

    : 一段描述這個

    Unit

    檔案的文字,通常隻是簡短的一句話。
  • Documentation

    : 指定服務的文檔,可以是一個或多個文檔的

    URL

    路徑。
  • Requires

    : 依賴的其他

    Unit

    清單,列在其中的

    Unit

    子產品會在這個服務啟動的同時被啟動,并且如果其中有任意一個服務啟動失敗,這個服務也會被終止。
  • Wants

    Requires

    相似,但隻是在被配置的這個

    Unit

    啟動時,觸發啟動列出的每個

    Unit

    子產品,而不去考慮這些子產品啟動是否成功。
  • After

    Requires

    相似,但會在後面列出的所有子產品全部啟動完成以後,才會啟動目前的服務。
  • Before

    After

    相反,在啟動指定的任一個子產品之前,都會首先確定目前服務已經運作。
  • BindsTo

    Requires

    相似,但是一種更強的關聯,啟動這個服務時會同時啟動列出的所有子產品,當有子產品啟動失敗時終止目前服務,反之,隻要列出的子產品全部啟動以後,也會自動啟動目前服務。并且這些子產品中有任意一個出現意外結束或重新開機,這個服務會跟着終止或重新開機。
  • PartOf

    : 這是一個

    BindTo

    作用的子集,僅在列出的任何子產品失敗或重新開機時,終止或重新開機目前服務,而不會随列出子產品的啟動而啟動。
  • OnFailure

    : 當這個子產品啟動失敗時,就自動啟動列出的每個子產品。
  • Conflicts

    : 與這個子產品有沖突的子產品,如果列出子產品中有已經在運作的,這個服務就不能啟動,反之亦然。

Install段

這個段中的配置與

Unit

有幾分相似,但是這部配置設定置需要通過

systemctl enable

指令來激活,并且可以通過

systemctl disable

指令禁用,另外這部配置設定置的目标子產品通常是特定啟動級别的

.target

檔案,用來使得服務在系統啟動時自動運作。

  • WantedBy

    : 和前面的

    Wants

    作用相似,隻是後面列出的不是服務所依賴的子產品,而是依賴目前服務的子產品。
  • RequiredBy

    Requires

    作用相似,同樣後面列出的不是服務所依賴的子產品,而是依賴目前服務的子產品。
  • Also

    : 當這個服務被

    enable/disable

    時,将自動

    enable/disable

    後面列出的每個子產品。

Service段

這個段是

.service

檔案獨有的,也是對于服務配置最重要的部分,這部分的配置選項非常多,主要分為服務生命周期控制和服務上下文配置兩個方面,下面是一些常用的配置,另外還有一些限制特定服務可用的系統資源量,例如

CPU

、程式堆棧,檔案句柄數量,子程序數量等等,可參考

Linux

文檔資源配額。

  • Type

    : 服務的類型,常用的有

    simple

    forking

    ,預設的

    simple

    類型可以适應于絕大多數的場景,是以一般可以忽略這個參數的配置,而如果服務程式啟動後會通過

    fork

    系統調用建立子程序,然後關閉應用程式本身程序的情況,則應該将

    Type

    的值設定為

    forking

    ,否則

    systemd

    将不會跟蹤子程序的行為,而認為服務已經退出。
  • RemainAfterExit

    : 值為

    true

    false

    ,也可以寫

    yes

    no

    false

    ,當配置值為

    true

    時,

    systemd

    隻會負責啟動服務程序,之後即便服務程序退出了,

    systemd

    仍然會認為這個服務是在運作中的,這個配置主要是提供給一些并非常駐記憶體,而是啟動注冊後立即退出然後等待消息按需啟動的特殊類型服務使用。
  • ExecStart

    : 這個參數是幾乎每個

    .service

    檔案都會有的,指定服務啟動的主要指令,在每個配置檔案中隻能使用一次。
  • ExecStartPre

    : 指定在啟動執行

    ExecStart

    的指令前的準備工作,可以有多個,所有指令會按照檔案中書寫的順序依次被執行。
  • ExecStartPost

    ExecStart

    的指令後的收尾工作,也可以有多個。
  • TimeoutStartSec

    : 啟動服務時的等待的秒數,如果超過這個時間服務仍然沒有執行完所有的啟動指令,則

    systemd

    會認為服務自動失敗,這一配置對于使用

    Docker

    容器托管的應用可能十分重要,由于

    Docker

    第一次運作時可以能會需要從網絡下載下傳服務的鏡像檔案,是以造成比較嚴重的延時,容易被

    systemd

    誤判為啟動失敗而殺死,通常對于這種服務,需要将

    TimeoutStartSec

    的值指定為 ,進而關閉逾時檢測。
  • ExecStop

    : 停止服務所需要執行的主要指令。
  • ExecStopPost

    : 指定在

    ExecStop

    指令執行後的收尾工作,也可以有多個。
  • TimeoutStopSec

    : 停止服務時的等待的秒數,如果超過這個時間服務仍然沒有停止,

    systemd

    會使用

    SIGKILL

    信号強行殺死服務的程序。
  • Restart

    : 這個值用于指定在什麼情況下需要重新開機服務程序,常用的值有

    no

    on-success

    on-failure

    on-abnormal

    on-abort

    always

    ,預設值為

    no

    ,即不會自動重新開機服務。
  • RestartSec

    : 如果服務需要被重新開機,這個參數的值為服務被重新開機前的等待秒數。
  • ExecReload

    : 重新加載服務所需執行的主要指令。
  • Environment

    : 為服務添加環境變量。
  • EnvironmentFile

    : 指定加載一個包含服務所需的環境變量清單的檔案,檔案中的每一行都是一個環境變量的定義。
  • Nice

    : 服務的程序優先級,值越小優先級越高,預設為 ,

    -20

    為最高優先級,

    19

    為最低優先級。
  • WorkingDirectory

    : 指定服務的工作目錄。
  • RootDirectory

    : 指定服務程序的根目錄

    /

    ,如果配置了這個參數後,服務将無法通路指定目錄以外的任何檔案。
  • User

    : 指定運作服務的使用者,會影響服務對本地檔案系統的讀寫執行權限。
  • Group

    : 指定運作服務的使用者組,會影響服務對本地檔案系統的通路權限。
  • StartLimitIntervalSec

    : 屬于設定單元的啟動頻率限制,用于設定時長,預設情況下,一個單元在

    10

    秒内最多允許啟動

    5

    次。
  • StartLimitBurst

    : 屬于設定單元的啟動頻率限制,用于設定在一段給定的時長内,最多允許啟動多少次,預設情況下,一個單元在

    10

    5

檔案示例

[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service
           

示例

開機運作服務。

systemctl enable nginx.service
           

查詢服務是否開機啟動。

systemctl is-enabled nginx.service
           

取消開機運作。

systemctl disable nginx.service
           

啟動服務。

systemctl start nginx.service
           

停止服務。

systemctl stop nginx.service
           

重新開機服務。

systemctl restart nginx.service
           

重新加載服務配置檔案,修改配置檔案後需要首先執行

systemctl daemon-reload

systemctl reload nginx.service
           

查詢服務運作狀态。

systemctl status nginx.service
           

顯示啟動失敗的服務。

systemctl --failed
systemctl list-units --state failed
           

重置單元的啟動頻率計數器。

systemctl reset-failed
           

重新加載所有被修改過的服務配置,否則配置不會生效,當然實際上該指令還會完成很多事情,例如重新生成依賴樹。

systemctl daemon-reload
           

輸出所有單元。

systemctl list-units
           

列出所有單元狀态概覽。

systemctl status
           

檢視已激活的服務。

systemctl list-units -t service
           

檢視所有已安裝服務。

systemctl list-unit-files
           

檢查

nginx

服務的所有配置細節。

systemctl show nginx.service
           

擷取

nginx

服務的依賴性清單。

systemctl list-dependencies nginx.service
           

檢視環境變量。

systemctl show-environment
           

重新開機系統。

systemctl reboot
           

關閉系統。

systemctl poweroff
           

CPU

停止工作。

systemctl halt
           

暫停系統。

systemctl suspend
           

讓系統進入冬眠狀态。

systemctl hibernate
           

讓系統進入互動式休眠狀态。

sudo systemctl hybrid-sleep
           

啟動進入救援狀态,即單使用者狀态。

systemctl rescue
           

每日一題

https://github.com/WindrunnerMax/EveryDay
           

參考

https://www.cnblogs.com/tsdxdx/p/7288490.html
https://www.cnblogs.com/chjbbs/p/6288592.html
https://www.geeksforgeeks.org/systemctl-in-unix/
http://www.jinbuguo.com/systemd/systemd.unit.html
https://blog.csdn.net/m0_38023255/article/details/78757655
https://www.commandlinux.com/man-page/man1/systemctl.1.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
           
上一篇: curl指令
下一篇: 列印機服務