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


1. 開機啟動

對於支持 systemd 的軟件,如果想要設置開機啟動,就執行如下命令(以 http 為例):

systemctl enable httpd

上面的命令相當於在 /etc/systemd/system/ 目錄里添加了一個符號鏈接,指向 /usr/lib/systemd/system/ 里面的 httpd.service 文件。

這是因為開機時,Systemd 只執行 /etc/systemd/system/ 目錄里面的配置文件。這也就意味着,將修改后的配置文件放在這里目錄里,就可以達到覆蓋原始配置的效果。

 

2. 啟動服務

啟動服務使用如下命令:

systemctl start httpd

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

[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.

說明:

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

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

  (3)Main行:主進程PID;

  (4)Status行:由應用本身提供的軟件當前狀態;

  (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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM