linux中systemctl詳細理解及常用命令

一、systemctl理解
Linux 服務管理兩種方式service和systemctl

systemd是Linux系統最新的初始化系統(init),作用是提高系統的啓動速度,儘可能啓動較少的進程,儘可能更多進程併發啓動。

systemd對應的進程管理命令是systemctl

 

1. systemctl命令兼容了service
即systemctl也會去/etc/init.d目錄下,查看,執行相關程序

systemctl redis start
 
systemctl redis stop
 
# 開機自啓動
 
systemctl enable redis
2. systemctl命令管理systemd的資源Unit
systemd的Unit放在目錄/usr/lib/systemd/system(Centos)或/etc/systemd/system(Ubuntu)

 

主要有四種類型文件.mount,.service,.target,.wants

.mount文件

.mount文件定義了一個掛載點,[Mount]節點裏配置了What,Where,Type三個數據項

等同於以下命令:

mount -t hugetlbfs /dev/hugepages hugetlbfs

 

.service文件

.service文件定義了一個服務,分爲[Unit],[Service],[Install]三個小節

[Unit]

Description:描述,

After:在network.target,auditd.service啓動後才啓動

ConditionPathExists: 執行條件

 

[Service]

EnvironmentFile:變量所在文件

ExecStart: 執行啓動腳本

Restart: fail時重啓

 

[Install]

Alias:服務別名

WangtedBy: 多用戶模式下需要的

 

 

.target文件

.target定義了一些基礎的組件,供.service文件調用

 

.wants文件

.wants文件定義了要執行的文件集合,每次執行,.wants文件夾裏面的文件都會執行

 

二、常用命令
1.查看版本號
systemctl –-version


 

2.管理服務(unit)
systemctl 提供了一組子命令來管理單個的 unit,其命令格式爲:

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。

kill :不要被 kill 這個名字嚇着了,它其實是向運行 unit 的進程發送信號。

show:列出 unit 的配置。

mask:註銷 unit,註銷後你就無法啓動這個 unit 了。

unmask:取消對 unit 的註銷。

 

我們先通過 etcd.service 來觀察服務類型 unit 的基本信息:

輸出內容的第一行是對 unit 的基本描述。

第二行中的 Loaded 描述操作系統啓動時會不會啓動這個服務,enabled 表示開機時啓動,disabled 表示開機時不啓動。而啓動該服務的配置文件路徑爲:/lib/systemd/system/etcd.service。

第三行 中的 Active 描述服務當前的狀態,active (running) 表示服務正在運行中。如果是 inactive (dead) 則表示服務當前沒有運行。後面則是服務的啓動時間。

第四行的 Docs 提供了在線文檔的地址。

下面的 Main PID 表示進程的 ID,接下來是任務的數量,佔用的內存和 CPU 資源。

再下面的 Cgroup 描述的是 cgrpup 相關的信息,筆者會在後續的文章中詳細的介紹。

最後是輸出的日誌信息。

 

關於 unit 的啓動狀態,除了 enable 和 disable 之外還有:

static:這個 unit 不可以自己啓動,不過可能會被其它的 enabled 的服務來喚醒。

mask:這個 unit 無論如何都無法被啓動!因爲已經被強制註銷。可通過 systemctl unmask 改回原來的狀態。

 

關於 unit 的運行狀態 Active,除了 active 和 inactive 之外還有:

active (exited):僅執行一次就正常結束的服務,目前並沒有任何程序在系統中執行。舉例來說,開機或者是掛載時纔會進行一次的 quotaon 功能,就是這種模式! Quotaon 不需要一直執行,只在執行一次之後,就交給文件系統去自行處理。通常用 bash shell 寫的小型服務,大多是屬於這種類型。

active (waiting):正在執行當中,不過還再等待其他的事件才能繼續處理。舉例來說,打印的相關服務就是這種狀態。

 

enable 和 disable 操作

比如我們爲 etcd 服務創建了配置文件 /lib/systemd/system/etcd.service,然後執行 enable 命令:

systemctl enable etcd.service


所謂的 enable 就是在 multi-user.target.wants 下面創建了一個鏈接文件:

至於爲什麼會鏈接到 multi-user.target.wants 目錄下,則是由 etcd.server 文件中的配置信息決定的。

 

查看 unit 的配置

使用 show 子命令可以查看 unit 的詳細配置情況:

 systemctl show etcd.service


 

註銷與反註銷 unit

如果我們想暫時的禁用某個 unit,比如 etcd.service,可以註銷這個 unit,註銷之後就無法再啓動這個服務了:

systemctl mask etcd.service


從上圖中的輸出我們可以看到,所謂的註銷就是把 etcd.service 文件鏈接到 /dev/null 這個空設備中去了。所以就無法再啓動該服務了。下面我們嘗試執行一次反註銷:

systemctl unmask etcd.service


unmask 操作就是刪除掉 mask 操作中創建的鏈接。

 

查看系統上的 unit

systemctl 提供了子命令可以查看系統上的 unit,命令格式爲:

systemctl [command] [--type=TYPE] [--all]

command 有:

list-units:列出當前已經啓動的 unit,如果添加 -all 選項會同時列出沒有啓動的 unit。

list-unit-files:根據 /lib/systemd/system/ 目錄內的文件列出所有的 unit。

--type=TYPE:可以過濾某個類型的 unit。

不帶任何參數執行 systemctl 命令會列出所有已啓動的 unit:

 

列舉已經啓動的unit

systemctl list-units (或者直接 sudo systemctl)


系統默認啓動的服務是非常多的,上圖只截取了前面幾行。下面是對輸出的介紹:

UNIT:項目的名稱,包括各個 unit 的類別(看擴展名)。

LOAD:開機時 unit 的配置是否被加載。

ACTIVE:目前的狀態,須與後續的 SUB 搭配!就是我們用 systemctl status 觀察時,active的內容。

DESCRIPTION:描述信息。

注意,systemctl 不加參數,其實等同於 systemctl list-units

 

查看系統上一共裝了多個unit

systemctl list-unit-files


結果也非常的多,我們仍然只截取一部分結果。這裏的 STATE 就是我們前面介紹的 服務的啓動狀態,有 enable 和 disable、static 和 mask。

 

只查看某種類型的unit

比如我們只查看服務類型的unit:

systemctl list-units --type=service -all


 

查看加載失敗的 unit

如果發現某個 unit 不工作,可以查看是否有 unit 加載失敗:

​​​​​​​systemctl --failed


 

管理不同的操作環境(target unit)

通過指定 --type=target 就可以用 systemctl list-units 命令查看系統中默認有多少種 target:

我們在此僅介紹幾個常用的 target。

graphical.target:就是文字界面再加上圖形界面,這個 target 已經包含了下面的 multi-user.target。

multi-user.target:純文本模式!

rescue.target:在無法使用 root 登陸的情況下,systemd 在開機時會多加一個額外的臨時系統,與你原本的系統無關。這時你可以取得 root 的權限來維護你的系統。

emergency.target:緊急處理系統的錯誤,在無法使用 rescue.target 時,可以嘗試使用這種模式!

shutdown.target:就是執行關機。

getty.target:可以設置 tty 的配置。

正常的模式是 multi-user.target 和 graphical.target 兩個,救援方面的模式主要是 rescue.target 以及更嚴重的 emergency.target。如果要修改可提供登陸的 tty 數量,則修改 getty.target。

 

下面是操作 target unit 命令的格式:

systemctl [command] [unit.target]
command 有:

get-default:取得目前的 target。

set-default:設置後面接的 target 成爲默認的操作模式。

isolate:切換到後面接的模式。

 

查看和設置默認的 target

systemctl get-default


 

切換 target

我們還可以在不重新啓動的情況下切換不同的 target,比如從圖形界面切換到純文本的模式:

systemctl isolate multi-user.target
在一般情況下,使用上述 isolate 的方式即可完成不同 target 的切換。不過爲了方便起見,systemd 也提供了

幾個簡單的指令用來切換操作模式,大致如下所示:

sudo systemctl poweroff # 系統關機

sudo systemctl reboot  # 重新開機

sudo systemctl suspend  # 進入暫停模式

sudo systemctl hibernate # 進入休眠模式

sudo systemctl rescue  # 強制進入救援模式

sudo systemctl emergency # 強制進入緊急救援模式

這裏簡單介紹一下暫停模式與休眠模式的區別

suspend:暫停模式會將系統的狀態保存到內存中,然後關閉掉大部分的系統硬件,當然,並沒有實際關機。當用戶按下喚醒機器的按鈕,系統數據會從內存中回覆,然後重新驅動被大部分關閉的硬件,所以喚醒系統的速度比較快。

hibernate:休眠模式則是將系統狀態保存到硬盤當中,保存完畢後,將計算機關機。當用戶嘗試喚醒系統時,系統會開始正常運行,然後將保存在硬盤中的系統狀態恢復回來。因爲數據需要從硬盤讀取,因此喚醒的速度比較慢(如果你使用的是 SSD 磁盤,喚醒的速度也是非常快的)。

 

檢查 unit 之間的依賴性

很多服務之間是有依賴關係的,systemd 的一大亮點就是可以管理 unit 之間的依賴關係。我們可以通過下面的命令來查看 unit 間的依賴關係:

systemctl list-dependencies [unit] [--reverse] 選項 --reverse 會反向追蹤是誰在使用這個 unit。

下面讓我們看看當前運行的 target 的依賴關係:

我們當前運行在 graphical.target 下,它由一個長長的依賴列表(上圖並未展示所有的項目),其中最重要的依賴項目爲 multi-user.target。下面我們使用 --reverse 選項查看 multi-user.target unit 被誰使用:

systemctl list-dependencies multi-user.target --reverse

從上面兩張圖上我們可以確定下面的關係:graphical.target 依賴 multi-user.target。

我們這裏只是通過 target unit 介紹瞭如何查看 unit 之間的依賴關係,實際使用中更多的是檢查服務 unit 之間的依賴關係。

 

相關的目錄和文件

在不同的發行版中與 systemd 相關的文件路徑可能會不太一樣,強調一下,本文介紹的是 ubuntu 16.04 。

/lib/systemd/system/ 大多數 unit 的配置文件都放在這個目錄下。

/run/systemd/system/ 系統運行過程中產生的腳本,比如用戶相關的腳本和會話相關的腳本。

/etc/systemd/system/ 這個目錄中主要的文件都是指向 /lib/systemd/system/ 目錄中的鏈接文件。

注意,在我們自己創建 unit 配置文件時,既可以把配置文件放在 /lib/systemd/system/ 目錄下,也可以放在 /etc/systemd/system/ 目錄下。

 

/etc/default/ 這個目錄中放置很多服務默認的配置文件。

/var/lib/ 一些會產生數據的服務都會將他的數據寫入到 /var/lib/ 目錄中,比如 docker 相關的數據文件就放在這個目錄下。

/run/ 這個目錄放置了好多服務運行時的臨時數據,比如 lock file 以及 PID file 等等。

 

我們知道 systemd 裏管理了很多會用到本機 socket 的服務,所以系統中肯定會產生很多的 socket 文件。那麼,這些 socke 文件都存放在哪裏呢?我們可以使用 systemctl 進行查看:

systemctl list-sockets


 

其實,絕大多數的 socket 文件都存放在 /run 目錄及其子目錄中。

 

systemctl daemon-reload 子命令

daemon-reload 是一個很容易被誤用的子命令,主要是因爲它名字中包含的 daemon 一詞很容易讓它和 reload 子命令混淆。

我們在前文簡略的介紹了 reload 子命令,它的作用是重新加載某個服務程序的配置文件。這裏的程序指的是服務類型 unit 的配置中指定的程序,也就是我們常說的 daemon(提供某種服務的應用程序)。比如服務類型的 unit prometheus.service,提供服務的 daemon 程序在我的機器上是 /usr/local/share/prometheus/prometheus,所以 reload 子命令重新加載的是 prometheus 的配置文件。

如果把 daemon-reload 子命令中的 daemon 理解爲 systemd 程序,就可以把這個命令解釋爲重新加載 systemd 程序的配置文件。而所有的 unit 配置文件都是作爲 systemd 程序的配置文件存在的。這樣得出的結論就是:

新添加 unit 配置文件時需要執行 daemon-reload 子命令

有 unit 的配置文件發生變化時也需要執行 daemon-reload 子命令

daemon-reload 命令會做很多的事情,其中之一是重新生成依賴樹(也就是 unit 之間的依賴關係),所以當你修改了 unit 配置文件中的依賴關係後如果不執行 daemon-reload 命令是不會生效的。

 

 

以上內容整理:

https://www.cnblogs.com/shijingjing07/p/9301590.html

https://www.jb51.net/article/136559.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章