systemd 中的配置文件

每一個 Unit 都有一個配置文件,告訴 Systemd 怎麼啓動這個 Unit 。

Systemd 默認從目錄 / etc/systemd/system / 讀取配置文件。裏面存放的大部分文件都是符號鏈接,指向目錄 / usr/lib/systemd/system/,真正的配置文件存放在那個目錄。

設置開機啓動 systemctl enable 命令實際上就是在上面兩個目錄之間,建立符號鏈接關係。

也就是說不管是不是開機啓動的 Unit,配置文件全部要存放在 / usr/lib/systemd/system / 目錄中,開機時 Systemd 只執行 / etc/systemd/system 目錄裏面的配置文件。這也意味着,如果把修改後的配置文件放在該目錄,就可以達到覆蓋原始配置的效果。當然也可以直接複製一份配置文件到 / etc/systemd/system 目錄而不是建立軟連接,也可以達到開機啓動的目的。

systemctl enable httpd.service 命令等同於

ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

與之對應的,撤銷開機啓動命令 systemctl disable 命令實際上就是在兩個目錄之間撤銷符號鏈接關係。

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

配置文件 / etc/systemd/system.conf 裏面是 systemcel 控制服務的統一配置文件,單個服務的配置文件會覆蓋該文件設置

    DefaultLimitCORE=infinity:限制內核文件的大小
    DefaultLimitNOFILE=65536:服務最大允許打開的文件描述符數量(默認爲1024,在centos7中設置爲infinity則實際爲65536)DefaultLimitNPROC=65536:服務進程的最大數量

一、配置文件的自啓動狀態

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

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

命令會輸出一個列表,顯示每個配置文件的啓動鏈接狀態,一共有四種。

enabled:已建立啓動鏈接

disabled:沒建立啓動鏈接

static:該配置文件沒有 [Install] 部分(無法執行),只能作爲其他配置文件的依賴

masked:該配置文件被禁止建立啓動鏈接

二、配置文件的格式

配置文件就是普通的文本文件,可以用文本編輯器打開,systemctl cat 命令可以查看配置文件的內容。如 systemctl cat sshd.service

配置文件內容分成幾個區塊。每個區塊的第一行,是用方括號表示的區別名,比如 [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 類型的 Unit 纔有這個區塊,定義如何啓動當前服務。它的主要字段如下。

Type:定義啓動時的進程行爲。它有以下幾種值。

    simple:默認值,執行ExecStart指定的命令,啓動主進程
    forking:以 fork 方式從父進程創建子進程,創建後父進程會立即退出,子進程將成爲主進程
    oneshot:一次性進程,類似於simple,但只執行一次,Systemd 會等當前服務退出,再繼續往下執行
    dbus:當前服務通過D-Bus啓動,類似於simple,但會等待 D-Bus 信號後啓動
    notify:當前服務啓動完畢,會發出通知信號通知Systemd,然後 Systemd 再繼續啓動其他服務
    idle:類似於simple,但是要等到其他任務都執行完畢,纔會啓動該服務。一種使用場合是爲讓該服務的輸出,不與其他服務的輸出相混合

User:指定開機自動運行該程序的用戶名

Group:指定開機自動運行該程序的用戶組

LimitCORE=infinity:限制內核文件的大小

LimitNOFILE=65536:服務最大允許打開的文件描述符數量

LimitNPROC=65536:進程的最大數量

PIDFile:指定開機自動運行該程序的 pid 文件 (一般在程序配置文件中配置該項)

ExecStart:啓動當前服務的命令

ExecStartPre:啓動當前服務之前執行的命令

ExecStartPost:啓動當前服務之後執行的命令

ExecReload:重啓當前服務時執行的命令

ExecStop:停止當前服務時執行的命令

ExecStopPost:停止當其服務之後執行的命令

KillMode:定義如何停止服務。KillMode 字段可以設置的值如下 control-group(默認值):當前控制組裏面的所有子進程,都會被殺掉; process:只殺主進程; mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號; none:沒有進程會被殺掉,只是執行服務的 stop 命令。如 ssh 服務將 KillMode 設爲 process,不停止任何 sshd 子進程,即子進程打開的 SSH session 仍然保持連接,這個設置不太常見,但對 sshd 很重要,否則你停止服務的時候,會連自己打開的 SSH session 一起殺掉。

RestartSec:自動重啓當前服務等待的秒數

Restart:定義了當前服務退出後,Systemd 的重啓方式,可能的值包括 no(默認值):退出後不會重啓; always:不管是什麼退出原因,總是重啓; on-success:只有正常退出時 (退出狀態碼爲 0),纔會重啓; on-failure:非正常退出時 (退出狀態碼非 0),包括被信號終止和超時,纔會重啓; on-abnormal:只有被信號終止和超時,纔會重啓; on-abort:只有在收到沒有捕捉到的信號終止時,纔會重啓; on-watchdog:超時退出,纔會重啓,如 ssh 服務設置爲 on-failure,表示任何意外的失敗,就將重啓 sshd。如果 sshd 正常停止 (比如執行 systemctl stop 命令),它就不會重啓。

RemainAfterExit:值爲 yes 或 no,表示進程退出以後,服務仍然保持執行。這樣的話,一旦使用 systemctl stop 命令停止服務,ExecStop 指定的命令就會執行

TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數

Environment:指定當前服務的環境變量

EnvironmentFile:指定當前服務的環境參數文件,該文件的 key=value 鍵值對,可以用 $key 的形式,在當前配置文件中獲取

所有的啓動設置都可以加上一個連詞號 (-),表示 "抑制錯誤",即發生錯誤的時候,不影響其他命令的執行。比如,EnvironmentFile=-/etc/sysconfig/sshd,表示即使 / etc/sysconfig/sshd 文件不存在,也不會拋出錯誤。

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

WantedBy:它的值是一個或多個 Target,當前 Unit 激活時 (enable) 符號鏈接會放入 / etc/systemd/system 目錄下面以 Target 名 + .wants 後綴構成的子目錄中

RequiredBy:它的值是一個或多個 Target,當前 Unit 激活時,符號鏈接會放入 / etc/systemd/system 目錄下面以 Target 名 + .required 後綴構成的子目錄中

Alias:當前 Unit 可用於啓動的別名

Also:當前 Unit 激活 (enable) 時,會被同時激活的其他 Unit

Target 的配置文件

Target 也有自己的配置文件,比如:systemctl cat multi-user.target

[Unit]

Description=Multi-User System

Documentation=man:systemd.special(7)

Requires=basic.target

Conflicts=rescue.service rescue.target

After=basic.target rescue.service rescue.target

AllowIsolate=yes

注意,Target 配置文件裏面沒有啓動命令。

上面輸出結果中,主要字段含義如下。

Requires 字段:要求 basic.target 一起運行。

Conflicts 字段:衝突字段。如果 rescue.service 或 rescue.target 正在運行,multi-user.target 就不能運行,反之亦然。

After:表示 multi-user.target 在 basic.target 、 rescue.service、 rescue.target 之後啓動,如果它們有啓動的話。

AllowIsolate:允許使用 systemctl isolate 命令切換到 multi-user.target。

作者:qingheluo

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://www.qingheluo.com/systemdzhongdepeizhiwenjian/