RHEL7服務管理工具systemctl

panpong發表於2016-12-10

CentOS 7.x 以後,Red Hat 系列的 distribution 放棄沿用多年的 System V 開機啟動服務的流程,就是init 啟動指令碼的方法,改用 systemd 這個啟動服務管理機制;

基本上,systemd 將過去所謂的 daemon 執行指令碼通通稱為一個服務單位 (unit),而每種服務單位依據功能來區分時,就分類為不同的型別 (type)。 基本的型別有包括系統服務、資料監聽與交換的插槽檔服務 (socket)、儲存系統狀態的快照型別、提供不同類似執行等級分類的操作環境 (target) 等等。 哇!這麼多型別,那設定時會不會很麻煩呢?其實還好,因為配置檔案都放置在底下的目錄中:

/usr/lib/systemd/system/:每個服務最主要的啟動指令碼設定,有點類似以前的 /etc/init.d  底下的檔案;

/run/systemd/system/:系統執行過程中所產生的服務指令碼,這些指令碼的優先序要比 /usr/lib/systemd/system/  高!

/etc/systemd/system/:管理員依據主機系統的需求所建立的執行指令碼,其實這個目錄有點像以前/etc/rc.d/rc5.d/Sxx 之類的功能!執行優先序又比 /run/systemd/system/  高喔!

1)  systemd  unit 型別分類說明

/usr/lib/systemd/system/ 以下的資料如何區分上述所謂的不同的型別 (type) 呢?很簡單!看副檔名!

副檔名

主要服務功能

 

.service

一般服務型別 (service  unit):主要是系統服務,包括伺服器本身所需要的本地服務以及網路服務都 是!比較經常被使用到的服務大多是這種型別! 所以,這也是最常見的型別了!

 

.socket

內部程式資料交換的插槽服務 (socket unit):主要是 IPC (Inter-process

communication) 的傳輸訊息插槽檔案 (socket file) 功能。 這種型別的服務通常在監控訊息傳遞的插槽檔案,當有透過此插槽檔案傳遞訊息來說要連結服務時,就依據當時的狀態將該使用者的要求傳送到對應的 daemon,若daemon尚未啟動,則啟動該daemon後再傳送使用者的要求。

使用 socket 型別的服務一般是比較不會被用到的服務因此在開機時通常會稍微延遲啟動的時間 (因為比較沒有這麼常用嘛!)。一般用於本地服務比較多,例如我們的圖形介面很多的軟體都是透過 socket來進行本機程式資料交換的行為。(這與早期的 xinetd 這個 super daemon 有部份的相似喔!)

 

.target

執行 (target unit) unit 到的 multi-user.target 其實 就是一堆服務的集合~也就是說, 選擇執行 multi-user.target 就是執行一堆其他 .service / .socket  之類的服務就是了!

.mount

.automount

檔案系統掛載相關的服務 (automount unit / mount unit):例如來自網路的自動掛載、NFS  檔案系統

掛載等與檔案系統相關性較高的程式管理。

 

.path

偵測特定檔案或目錄型別 (path unit):某些服務需要偵測某些特定的目錄來提供佇列服務,例如最 常見是透過偵動打 得要 .path 型支援 了!

 

.timer

迴圈執行的服務 (timer unit):這個東西有點類似 anacrontab  喔!不過是由 systemd  主動提供的, anacrontab  更加有彈性!

 

2)  如何啟動/關閉、啟用/禁用服務

[root@study ~]# systemctl [command] [unit]

command 主要有:

start    :立刻啟動後面接的 unit stop     :立刻關閉後面接的 unit

restart  :立刻關閉後啟動後面接的 unit,亦即執行 stop start 的意思

reload   :不關閉後面接的 unit 的情況下,過載配置檔案,讓設定生效

enable   :設定下次開機時,後面接的 unit 會被啟動

disable  :設定下次開機時,後面接的 unit 不會被啟動

status   :目前後面接的這個 unit 的狀態,會列出有沒有正在執行、開機預設執行否、登入等資訊等!

is-active :目前有沒有正在運作中

is-enable :開機時有沒有預設要啟用這個 unit

例如:

啟動一個服務:systemctl start postfix.service

關閉一個服務:systemctl stop postfix.service

重啟一個服務:systemctl restart postfix.service

顯示一個服務的狀態:systemctl status postfix.service

在開機時啟用一個服務:systemctl enable postfix.service

在開機時禁用一個服務:systemctl disable postfix.service

檢視服務是否開機啟動:systemctl is-enabled postfix.service

檢視已啟動的服務列表:systemctl list-unit-files|grep enabled

檢視啟動失敗的服務列表:systemctl --failed

PS:使用命令 systemctl is-enabled postfix.service 得到的值可以是enabledisablestatic,這裡的 static 它是指對應的 Unit 檔案中沒有定義[Install]區域,因此無法配置為開機啟動服務。說明:啟用服務就是在當前“runlevel”的配置檔案目錄/etc/systemd/system/multi-user.target.wants/裡,建立/usr/lib/systemd/system裡面對應服務配置檔案的軟連結;

禁用服務就是刪除此軟連結,

新增服務就是新增軟連線。如下:

#systemctl disable nfs-server.service
rm '/etc/systemd/system/multi-user.target.wants/nfs-server.service'
#systemctl enable nfs-server.service
ln -s '/usr/lib/systemd/syste/nfs-server.service' '/etc/systemd/system/multi-user.target.wants/nfs-server.service'

3)  檢視所有unit服務

[root@study ~]# systemctl

[root@study ~]# systemctl list-unit-files

[root@study ~]# systemctl list-units --type=service --all

[root@study ~]#systemctl list-units --type=target --all

systemd 也提供了數個簡單的指令給我們切換操作模式之用喔! 大致上如下所示:

[root@study ~]# systemctl poweroff 系統關機

[root@study ~]# systemctl reboot   重新啟動

[root@study ~]# systemctl suspend  進入暫停模式

[root@study ~]# systemctl hibernate 進入休眠模式

[root@study ~]# systemctl rescue   強制進入救援模式

[root@study ~]# systemctl emergency 強制進入緊急救援模式

4)  檢視服務依賴性

systemctl list-dependencies [unit] [--reverse]

[root@study ~]# systemctl list-dependencies –reverse

選項與引數: --reverse :反向追蹤誰使用這個 unit 的意思!

 

systemd-cgls以樹形列出正在執行的程式,它可以遞迴顯示控制組內容。

 

參考文獻:

【1】              RHEL 7 systemctl 的用法(替代service chkconfig),http://blog.csdn.net/catoop/article/details/47318225

【2】              systemctl 命令完全指南,

【3】              鳥哥的Linux私房菜-基礎篇.第四版,17.2 透過 systemctl 管理服務

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16976507/viewspace-2130219/,如需轉載,請註明出處,否則將追究法律責任。

相關文章