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。
- 本文固定鏈接: https://www.qingheluo.com/systemdzhongdepeizhiwenjian/
- 轉載請註明: qingheluo 2018 年 05 月 28 日 於 清河洛 發表
作者:qingheluo
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://www.qingheluo.com/systemdzhongdepeizhiwenjian/