[TOC]
# 使用 systemd 控制服務
## 目標:
* 列出由 systemd 服務啟動的系統守護進程和網絡服務,以及套接字單元
* 使用 systemctl 控制系統守護進程和網絡服務
## systemd簡介
系統啟動和服務器進程由 systemd 系統和服務管理器進行管理。此程序提供了一種方式,可以在啟動時和運行中的系統上激活系統資源、服務器守護進程和其他進程。
守護進程是在執行各種任務的后臺等待或運行的進程。為了偵聽連接,守護進程使用套接字。套接字可以由守護進程創建,或者與守護進程分離,并且可能由另一個進程創建(如 systemd),隨后在客戶端建立連接時將套接字傳遞到守護進程。
服務通常指的是一個或多個守護進程,但啟動或停止一項服務可能會對系統的狀態進行一次性更改(如配置網絡接口),不會留下守護進程之后繼續運行。
一點歷史
許多年來,Linux 和 UNIX 系統的進程 ID 1 屬于 init 進程。此進程負責激活系統上的其他服務。常用的守護進程在系統啟動時通過 System v 和 Linux Standard Base(LSB)init 腳本啟動。較不常用的守護進程由其他服務根據需要啟動,如 initd 或 xinetd。這些系統存在諸多限制,但 systemd 可以解決。
在 Red Hat Enterprise Linux 7 中進程 ID 1 屬于 systemd 這一新的 init 系統。以下是 systemd 提供的幾項新功能:
* 并行化功能,它可以提高系統的啟動速度。
* 按需啟動守護進程,而不需要單獨的服務。
* 自動服務依賴關系管理可以防止長時間超時,例如在網絡不可用時不啟動網絡服務。
* 利用 Linux 控制組一起追蹤相關進程的方式。
### 注意
有了 systemd 基于 shell 的服務腳本僅用于幾個傳統服務。因此,帶有 shell 變量的配置文件將被取代,如 /etc/sysconfig 中可找到的配置文件。仍在使用的配置文件作為 systemd 環境文件被納入, 并作為 NAME=VALUE 對進行讀取。它們不再以 shell 腳本的形式提供。
systemctl 和 systemd 單元
systemctl 命令用于管理各種類型的 systemd 對象,它們稱為單元。可以通過 systemctl -t help 命令顯示可用單元類型的列表。
### 重要
systemctl 可以縮寫或“省略”單元名稱、進程數條目和單元說明,除非運行時帶有 -l 選項。
下方列出了一些常用單元類型:
* 服務單元具有 .service 擴展名,代表系統服務。這種單元用于啟動經常訪問的守護進程,如 web 服務器。
* 套接字單元具有 .socket 擴展名,代表進程間通信(IPC)套接字。套接字的控制可以在建立客戶端連接時傳遞到守護進程或新啟動的服務。套接字單元用于延遲系統啟動時的服務啟動,或者按需啟動不常用的服務。這原則上類似于使用 xinetd 超級服務器按需啟動的服務。
* 路徑單元具有 .path 擴展名,用于將服務的激活推遲到特定文件系統更改發生之后。這通常用于使用假脫機目錄的服務,如打印系統。
#### 服務狀態
可以通過 systemctl status name.type 查看服務的狀態。如果未提供單元類型,則 systemctl 將顯示服務單元的狀態(如果存在)。
~~~
[root@serverX~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled)
Active: active (running) since Thu 2014-02-27 11:35:39 EST: 7h ago
Main PID: 1073 (sshd)
CGroup: /system.slice/sshd.service
└──1037 /usr/sbin/sshd -D
Feb 27 11:51:39 server0.example.com systemd[1]: Started OpenSSH server daemo.
Feb 27 11:51:39 server0.example.com sshd[1073]: Could not load host key: /etc. . .y
Feb 27 11:51:39 server0.example.com sshd[1073]: Server listening on 0.0.0.0 . . . .
Feb 27 11:51:39 server0.example.com sshd[1073]: Server listening on : : port 22.
Feb 27 11:51:39 server0.example.com sshd[1270]: error: Could not load host k . . y
Feb 27 11:51:39 server0.example.com sshd[1270]: Accepted password for root f . . . 2
Hint: Some lines were ellipsized, use -l to show in full.
~~~
狀態輸出中可以找到表示服務狀態的幾個關鍵字:
|關鍵字 | 描述 |
| --- | --- |
|loaded | 單元配置文件已處理。 |
|active(running) |正在通過一個或多個持續進程運行。 |
|active(exited) |已成功完成一次性配置。 |
|active(waiting) |運行中,但正在等待事件。 |
|inactive |不在運行。 |
|enabled |將在系統啟動時啟動。 |
|disabled |不會在系統啟動時啟動。 |
|static |無法啟用,但可以由某一啟用的單元自動啟動。 |
### 注意
systemctl status NAME 命令取代了舊版 Red Hat Enterprise Linux 中使用的service NAME status 命令。
## 使用 systemctl 列出單元文件
* 查詢所有單元的狀態,已驗證系統啟動。
~~~
[root@serverX~]# systemctl
~~~
* 僅查詢服務單元的狀態。
~~~
[root@serverX~]# systemctl --type=service
~~~
* 調查屬于失敗或維護狀態的任何單元。可選添加 -l 選項以顯示完整的輸出。
~~~
[root@serverX~]# systemctl status rngd.service -l
~~~
* 也可以使用 status 參數來判斷特定的單元是否活動,以及顯示該文件是否已啟用在系統啟動時啟動。其他備用命令也可輕松顯示活動和已啟用狀態:
~~~
[root@serverX~]# systemctl is-active sshd
[root@serverX~]# systemctl is-enable sshd
~~~
* 列出所有已加載單元的活動狀態。也可選擇限制單元類型。--all 選項可加入不活動的單元。
~~~
[root@serverX~]# systemctl list-units --type=service
[root@serverX~]# systemctl list-units --type=service -all
~~~
* 查看所有單元的已啟用和已禁用配置。也可選擇限制單元類型。
~~~
[root@serverX~]# systemctl list-unit-files --type=service
~~~
* 僅查看失敗的服務。
~~~
[root@serverX~]# systemctl --failed --type=service
~~~
## 啟動和停止運行中系統上的系統守護進程
啟動、停止、重新啟動、重新加載和驗證狀態是管理服務時經常執行的操作。
* 查看 sshd 服務的狀態。
~~~
[root@serverX~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled)
Active: active (running) since Thu 2014-02-27 11:51:39 EST: 7h ago
Main PID: 1073 (sshd)
CGroup: /system.slice/sshd.service
└──1037 /usr/sbin/sshd -D
~~~
* 驗證進程正在運行。
~~~
[root@serverX~]# ps -up 1073
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1073 0.1 0.0 82992 3612 ? Ss 15:15 0:00 /usr/sbin/sshd -D
~~~
* 停止服務并驗證其狀態。
~~~
[root@serverX~]# systemctl stop sshd.service
[root@serverX~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled)
Active: inactive (dead) since Thu 2014-02-27 11:51:39 EST: 2s ago
Main PID: 1073 (code=exited , status=0/SUCCESS)
~~~
* 啟動服務并查看其狀態。進程 ID 已經改變。
~~~
[root@serverX~]# systemctl start sshd.service
[root@serverX~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled)
Active: active (running) since Thu 2014-02-27 18:52:39 EST: 2s ago
Main PID: 1253 (sshd)
CGroup: /system.slice/sshd.service
└──1253 /usr/sbin/sshd -D
~~~
* 以單一命令停止服務,然后再啟動該服務。
~~~
[root@serverX~]# systemctl restart sshd.service
[root@serverX~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled)
Active: active (running) since Thu 2014-02-27 18:54:39 EST: 2s ago
Main PID: 1268 (sshd)
CGroup: /system.slice/sshd.service
└──1268 /usr/sbin/sshd -D
~~~
* 發出指示使服務讀取和重新加載其配置文件,而不完全停止和啟動服務。進程 ID 不會改變。
~~~
[root@serverX~]# systemctl reload sshd.service
[root@serverX~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled)
Active: active (running) since Thu 2014-02-27 18:55:09 EST: 32s ago
Main PID: 1268 (sshd)
CGroup: /system.slice/sshd.service
└──1268 /usr/sbin/sshd -D
~~~
#### 單元依賴項
服務可能會以其他服務依賴項的形式啟動。如果套接字單元已啟用,但名稱相同的服務單元沒有啟動,對該網絡套接字發出請求時將自動啟動該服務。服務也可能會在滿足文件系統條件時由路徑單元觸發。
systemctl list-dependencies UNIT 命令可用于顯示必須與特定單元聯合啟動的其他單元的樹。此命令的 --reverse 選項將顯示哪些單元必須要在指定單元啟動后才能運行。
#### 屏蔽服務
系統可能針對某一特定功能安裝了有沖突的服務,如防火墻(iptables 和 firewalld)。為防止管理員意外啟動某一服務,可以屏蔽該服務。屏蔽將在配置目錄中創建鏈接,使得啟動該服務時什么也不會發生。
~~~
[root@serverX~]# systemctl mask network
ln -s '/dev/null' '/etc/systemd/system/network.service'
[root@serverX~]# systemctl unmask network
rm '/etc/systemd/system/network.service'
~~~
### 重要
禁用的服務不會在系統啟動時自動啟動,也不會被其他單元文件啟動,但可以手動啟動。屏蔽的服務無法手動啟動,也不會自動啟動。
## 使系統守護進程在系統啟動時啟動或停止
當相應的 systemd 配置目錄中創建有鏈接時,服務會在系統啟動時啟動。這些鏈接可以通過 systemctl 命令創建和刪除。
* 查看服務的狀態
~~~
[root@serverX~]# systemctl status sshd.service
~~~
* 禁用服務并驗證其狀態。請注意禁用服務不會停止該服務。
~~~
[root@serverX~]# systemctl disable sshd.service
[root@serverX~]# systemctl status sshd.service
~~~
* 啟用服務并驗證其狀態。
~~~
[root@serverX~]# systemctl enable sshd.service
[root@serverX~]# systemctl is-enabled sshd.service
~~~
## systemctl 命令摘要
可以在運行中的系統上啟動和停止服務,也可以啟用或禁用服務在系統啟動時自動啟動。
|命令 |任務 |
| --- | --- |
|systemctl status UNIT | 查看有關單元狀態的詳細信息 |
|systemctl stop UNIT | 在運行中的系統上停止一項服務 |
|systemctl start UNIT | 在運行中的系統上啟動一項服務 |
|systemcl restart UNIT | 在運行中的系統上重新啟動一項服務 |
|systemctl reload UNIT | 重新加載運行中服務的配置文件 |
|systemctl mask UNIT | 徹底禁用服務,使其無法手動啟動或在系統啟動時啟動 |
|systemctl unmask UNIT | 使屏蔽的服務變為可用 |
|systemctl enable UNIT | 將服務配置為在系統啟動時啟動 |
|systemctl disable UNIT | 禁止服務在系統啟動時啟動 |
|systemctl list-dependencis UNIT | 列出指定單元需要的單元 |