【 Linux 】Systemd 配置文件說明及編寫(2)

1. 開機啓動

對於支持 systemd 的軟件,若是想要設置開機啓動,就執行以下命令(以 http 爲例):html

systemctl enable httpd

上面的命令至關於在 /etc/systemd/system/ 目錄裏添加了一個符號連接,指向 /usr/lib/systemd/system/ 裏面的 httpd.service 文件。redis

這是由於開機時,Systemd 只執行 /etc/systemd/system/ 目錄裏面的配置文件。這也就意味着,將修改後的配置文件放在這裏目錄裏,就能夠達到覆蓋原始配置的效果。apache

 

2. 啓動服務

啓動服務使用以下命令:vim

systemctl start httpd

執行完上面的命令,使用 systemctl status httpd 查看:bash

[root@localhost ~]# systemctl status  httpd 
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-06-15 10:49:35 CST; 2s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 3253 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
 Main PID: 3258 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─3258 /usr/sbin/httpd -DFOREGROUND
           ├─3259 /usr/sbin/httpd -DFOREGROUND
           ├─3260 /usr/sbin/httpd -DFOREGROUND
           ├─3261 /usr/sbin/httpd -DFOREGROUND
           ├─3262 /usr/sbin/httpd -DFOREGROUND
           └─3263 /usr/sbin/httpd -DFOREGROUND

Jun 15 10:49:35 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Jun 15 10:49:35 localhost.localdomain systemd[1]: Started The Apache HTTP Server.

說明:session

  (1)Loaded行:配置文件的位置,是否設爲開機啓動;dom

  (2)Active行:表示正在運行;ssh

  (3)Main行:主進程PID;ui

  (4)Status行:由應用自己提供的軟件當前狀態;spa

  (5)CGroup行:應用的全部子進程

  (6)日誌塊:應用的日誌

 

 

3. 中止服務

中止正在運行服務,命令以下:

systemctl stop httpd

有時候,程序沒有響應了,使用 systemctl stop 停不下來,這時候就須要 發送 kill 信號:

systemctl kill httpd

此外,重啓服務

systemctl restart httpd

 

4. service 配置文件

一個服務怎麼啓動,徹底由它的配置文件決定。

配置文件主要目錄:
  /usr/lib/systemd/system/ 和 /etc/systemd/system/

 

systemctl cat 命令能夠用來查看配置文件,以 sshd.service 爲例:

[root@localhost ~]# systemctl cat sshd
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

配置文件被分爲了三大塊,下面對每一個區塊內容進行說明:

 

(1)[Unit] 區塊:啓動順序與依賴關係

Unit 區塊的 Description 字段給出了當前服務的簡單描述,Documentation 字段給出文檔位置。

接下來就是 啓動順序依賴關係

After 字段:表示若是network.target或sshd-keygen.service須要啓動,那麼sshd.service應該在它們以後啓動。

相應的,還有一個 Before 字段,定義 sshd.service 應該在哪些服務以前啓動。

注意,After 和 Before 字段只涉及啓動順序,不涉及依賴關係。

 

設置依賴關係,須要使用 Wants 字段和 Requires 字段。

Wants字段:表示sshd.service與sshd-keygen.service之間存在"弱依賴"關係,即若是"sshd-keygen.service"啓動失敗或中止運行,不影響sshd.service繼續執行。

Requires字段則表示"強依賴"關係,即若是該服務啓動失敗或異常退出,那麼sshd.service也必須退出。

 

注意:Wants 和 Rquires 字段只涉及依賴關係,與啓動順序無關,默認狀況下是同時啓動的。

 

(2)[Service] 區塊:啓動行爲

Service 區塊定義如何啓動當前服務。

2.1 啓動命令

許多軟件都有本身的環境參數文件,該文件能夠用 EnvironmentFile 字段讀取。

EnvironmentFile 字段:指定當前服務的環境參數文件。該文件內部的 key=value 鍵值對,能夠對 $key 的形式,在當前配置文件中獲取。

在 sshd.service 例子中, sshd 的環境參數文件是 /etc/sysconfig/sshd.

啓動腳本參數:

ExecStart 字段:定義啓動進程時執行的命令。

sshd 例子中,啓動的執行命令是: /usr/bin/sshd -D $OPTIONS,其中的 $OPTIONS 來自 EnvironmentFile字段指定的環境變量文件。

 

與之做用類似的,還有以下這些字段:

ExecReload字段:重啓服務時執行的命令
ExecStop字段:中止服務時執行的命令
ExecStartPre字段:啓動服務以前執行的命令
ExecStartPost字段:啓動服務以後執行的命令
ExecStopPost字段:中止服務以後執行的命令

 

下面編寫一個簡單的 testd.service 的例子:

[root@localhost ~]# vim /usr/lib/systemd/system/testd.service 

[Unit]
Description=Test

[Service]
Type=oneshot
ExecStart=/bin/echo start1  
ExecStart=  # 這裏設置了空值,意味着上面的賦值做廢
ExecStart=/bin/echo start3  
ExecStart=/bin/echo start4

# 執行 testd 服務
[root@localhost ~]# systemctl start testd
[root@localhost ~]# systemctl status  testd
● testd.service - Test
   Loaded: loaded (/usr/lib/systemd/system/testd.service; static; vendor preset: disabled)
   Active: inactive (dead)

Jun 15 12:45:17 localhost.localdomain systemd[1]: Starting Test...
Jun 15 12:45:17 localhost.localdomain echo[3349]: start3
Jun 15 12:45:17 localhost.localdomain echo[3351]: start4
Jun 15 12:45:17 localhost.localdomain systemd[1]: Started Test.

 

經過 systemctl status testd 能夠獲得執行結果:

start3
start4

 

注意:在全部的啓動設置以前,均可以加上一個連詞號(-),表示「抑制錯誤」,即發生錯誤的時候,不影響其餘命令的執行。好比:

EnvironmentFile=-/etc/sysconfig/sshd

表示:即便 /etc/sysconfig/sshd 文件不存在,也不會拋出錯誤。

 

2.2 啓動類型

Type 字段定義啓動類型。它能夠設置的值以下:

simple(默認值):ExecStart字段啓動的進程爲主進程
forking:ExecStart字段將以fork()方式啓動,此時父進程將會退出,子進程將成爲主進程
oneshot:相似於simple,但只執行一次,Systemd 會等它執行完,才啓動其餘服務
dbus:相似於simple,但會等待 D-Bus 信號後啓動
notify:相似於simple,啓動結束後會發出通知信號,而後 Systemd 再啓動其餘服務
idle:相似於simple,可是要等到其餘任務都執行完,纔會啓動該服務。一種使用場合是爲讓該服務的輸出,不與其餘服務的輸出相混合

 

在上面的例子中,已經使用到了 oneshot 這種類型,對於某些只須要執行一次,執行完成後,進程就退出的服務,能夠採用這種類型。

 

2.3 啓動行爲

Service 區塊有一些字段,定義了重啓行爲。

KillMode字段:定義 Systemd 如何中止 sshd 服務。

在 sshd 例子中,將 KillMode 字段設置爲 process 表示只中止主進程,不中止任何 sshd 子進程,即子進程打開的 SSH session 仍然保持鏈接。這個設置不太常見,但對 sshd 很重要,不然你中止服務的時候,會將本身打開的 SSH session 一塊殺掉。

KillMode 字段的值能夠設置以下:

control-group(默認值):當前控制組裏面的全部子進程,都會被殺掉
process:只殺主進程
mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號
none:沒有進程會被殺掉,只是執行服務的 stop 命令。

 

接下來是 Restart 字段。

Restart字段:定義了 sshd 退出後,Systemd 的重啓方式。

 

在 sshd 例子中,Restart 設爲 on-failure,表示任何意外的失敗,就將重啓 sshd。若是 sshd 正常中止(好比執行 systemctl stop 命令),它就不會重啓。

Restart 字段能夠設置的值以下:

no(默認值):退出後不會重啓
on-success:只有正常退出時(退出狀態碼爲0),纔會重啓
on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,纔會重啓
on-abnormal:只有被信號終止和超時,纔會重啓
on-abort:只有在收到沒有捕捉到的信號終止時,纔會重啓
on-watchdog:超時退出,纔會重啓
always:不論是什麼退出緣由,老是重啓

對於守護進程,推薦設爲 on-failure 對於那些容許發生錯誤退出的服務,能夠設置爲 on-abnormal

 

最後是 RestartSec 字段。

RestartSec字段:表示 Systemd 重啓服務以前,須要等待的秒數。上面的例子設爲等待42秒。

 

(3) [Install] 區塊

Install 區塊,定義如何安裝這個配置文件,即怎麼作到開機啓動。

WantedBy字段:表示該服務所在的 Target。

 

Target 的含義是服務組,表示一組服務。WantedBy=multiuser-target 指的是,sshd 所在的 Target 是 multi-user.target

這個設置很是重要,由於執行 sytemctl enable sshd.service 命令時,sshd.service 的一個符號連接,就會放在 /etc/systemd/system/multi-user.target.wants 子目錄中。

 

Systemd 有默認的啓動 Target

[root@localhost ~]# systemctl get-default
multi-user.target

上面的結果表示,默認的啓動 Target 是 multi-user.target 。在這個組裏的全部服務,都將開機啓動,這就是爲何 systemctl enable 命令能設置開機啓動的緣由。

 

在使用 Target 時,systemctl list-dependencies 命令和 systemctl isolate 命令也頗有用。

# 查看multi-user.target 包含的全部服務
systemctl list-dependencies multi-user.target

# 切換到另外一個 target
systemctl isolate graphical.target

 

通常來講,經常使用的 target 就兩個:

  1. multi-user.target - 多用戶命令行;

  2. graphical.target - 圖形界面模式

 

5. Target 配置文件

Target 也有配置文件:

[root@localhost ~]# systemctl cat multi-user.target
# /lib/systemd/system/multi-user.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[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

 

6. 修改配置文件後重啓

修改配置文件之後,須要從新加載配置文件,而後重啓相關服務。

# 從新加載配置文件
systemctl daemon-reload

# 重啓相關服務
systemctl restart sshd

 

參考連接:

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

相關文章
相關標籤/搜索