CentOS7服務管理工具systemctl 簡單使用

轉載。

systemd核心概念unit(單元)類型:unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息

cd /usr/lib/systemd/system
ls -l

常見unit類型 :

  • service :文件擴展名爲.service, 用於定義系統服務
  • target :文件擴展名爲.target,用於對 unit 進行邏輯分組,引導其他 unit 的執行。它替代了 SysV 中運行級別的作用,並提供更靈活的基於特定設備事件的啓動方式。例如 multi-user.target 相當於過去的運行級別5,而 bluetooth.target 在有藍牙設備接入時就會被觸發
  • device :用於定義內核識別的設備
  • mount:定義文件系統掛載點
  • socket:用於標識進程間通信用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動
  • snapshot :管理系統快照
  • swap:用於標識swap設備
  • automount :文件系統的自動掛載點
  • path:用於定義文件系統中的一個文件或目錄使用,常用於當文件系統變化時,延遲激活服務

最常用的大概是 service 和 target。

管理一個service 文件

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-enabled:開機時有沒有默認要啓用這個 unit。
kill :不要被 kill 這個名字嚇着了,它其實是向運行 unit 的進程發送信號。
show:列出 unit 的配置。
mask:註銷 unit,註銷後你就無法啓動這個 unit 了。
unmask:取消對 unit 的註銷

測試一個service 文件。比如nginx

cat nginx.service
[root@manager system]# cat nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

大致分爲三塊
Unit Service Install 詳細解釋 可以看大神博客 不知道允不允許貼鏈接
https://www.csdn.net/article/2015-02-27/2824034

Unit 段

  • Description 一段描述這個Unit文件的文字。
  • After 在後面列出的所有模塊啓動完成後纔會啓動當前服務

Service 段

  • Type 服務的類型,常用的有 simple(默認類型) 和 forking。默認的 simple 類型可以適應於絕大多數的場景,因此一般可以忽略這個參數的配置。而如果服務程序啓動後會通過 fork 系統調用創建子進程,然後關閉應用程序本身進程的情況,則應該將 Type 的值設置爲 forking,否則 systemd 將不會跟蹤子進程的行爲,而認爲服務已經退出。
  • PIDFile 服務運行時進程文件位置
  • ExecStartPre 指定在啓動執行 ExecStart 的命令前的準備工作,可以有多個
  • ExecStart 指定服務啓動的主要命令,在每個配置文件中只能使用一次
  • ExecReload 重新加載服務所需執行的主要命令

Install 段

這個段中的配置與 Unit 有幾分相似,但是這部分配置需要通過 systemctl enable 命令來激活,並且可以通過 systemctl disable 命令禁用。另外這部分配置的目標模塊通常是特定啓動級別的 .target 文件,用來使得服務在系統啓動時自動運行。

  • WantedBy 列出的是依賴當前服務的模塊。

上面使用的是 “WantedBy=multi-user.target” 表明當系統以多用戶方式(默認的運行級別)啓動時,這個服務需要被自動運行。當然還需要 systemctl enable 激活這個服務以後自動運行纔會生效。

使用systemctl 管理服務。

比如還是 nginx 後面的服務名就是要啓動的服務

  • 啓動服務 systemctl start nginx
  • 停止服務 systemctl stop nginx
  • 重啓服務 systemctl restart nginx
  • 查看服務狀態

查看服務狀態

  • 設置開機自動啓動服務
systemctl enable nginx
  • 取消開機自動啓動
systemctl disable nginx

設置開機啓動與取消
深入考慮,這個也不算是開機啓動。而是開機運行在multi-user 模式下,multi-user 會啓動該服務,這又和target 有關係。下一節在學習。

  • 註銷服務
systemctl mask nginx

註銷服務
一旦註銷,服務就會無法啓動

  • 取消註銷
systemctl unmask nginx

取消註銷後服務纔可以重新啓動。

  • 查看服務是否運行 systemctl is-active nginx
  • 查看服務是否開機自啓 systemctl is-enabled nginx
  • 查看服務依賴關係 systemctl list-dependencies nginx
systemctl list-dependencies nginx

查看nginx這個unit依賴的其它unit 如果加上–reverse 就是反向解析哪些unit依賴nginx

具體可以 使用 systemctl -h 查看幫助。
systemctl 也兼容了service。嘗試執行一個命令時也會在/etc/init.d目錄 查找

target 文件

這個target的解釋,大約是一組unit。有些target可以看做一種運行狀態,在這個運行狀態中,啓動了那些unit。

看其他博客解釋,很像是之前的運行級別概念,但是又不全是。

爲其他配置單元進行邏輯分組。它們本身實際上並不做什麼,只是引用其他配置單元而已,這樣便可以對配置單元做一個統一的控制,就可以實現大家都非常熟悉的運行級別的概念。比如,想讓系統進入圖形化模式,需要運行許多服務和配置命令,這些操作都由一個個的配置單元表示,將所有的這些配置單元組合爲一個目標(target),就表示需要將這些配置單元全部執行一遍,以便進入目標所代表的系統運行狀態。

查看當前 運行target, Get the name of the default target

systemctl get-default

顯示的 multi-user.target
應該是一個比較常用的 target了。我沒有安裝圖形界面。

查看當前target 啓動了哪些服務。後面沒有帶unit就是查看默認target 依賴那些unit。

systemctl list-dependencies

默認target依賴

可以看到 target 確實應該是一個unit 組的概念。運行模式也被看做一個target,只是這個target包含的unit比較多。

切換系統運行模式。(再次說一遍,但是自己也不確定對不對的理解。運行模式是一個target。但應該不是所有target都可以當成運行模式)

systemctl isolate NAME

NAME表示target。比如切換到multi-user 模式。。。這個。儘管本來就是multi模式

systemctl isolate multi-user

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

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

sudo systemctl poweroff # 系統關機
sudo systemctl reboot  # 重新開機
sudo systemctl suspend  # 進入暫停模式
sudo systemctl hibernate # 進入休眠模式
sudo systemctl rescue  # 強制進入救援模式
sudo systemctl emergency # 強制進入緊急救援模式

如果看成運行級別 大概是

級別0:runlevel0.target或shutdown.target
級別1:runlevel1.target或rescue.target
級別2:runlevel2.target或multi-user.target
級別3:runlevel3.target或multi-user.target
級別4:runlevel4.target或multi-user.target
級別5:runlevel5.target或graphical.taget
級別6:runlevel6.targe或reboot.target

關於開機自啓的學習
nginx 爲例
查看當前的運行模式

systemctl get-default

當前運行模式multi-user
查看該target的依賴關係。

systemctl list-dependencies multi-user.target

內容很多。表示了這個模式依賴的一些unit。猜測設置開機啓動 就是 將 nginx加入成爲multi-user的依賴。
設置開機啓動查看提示

[root@manager ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

創建了一個軟鏈接。
/etc/systemd/system/multi-user.target.wants/nginx.service
指向了
/usr/lib/systemd/system/nginx.service
查看目錄
/etc/systemd/system/multi-user.target.wants

cd  /etc/systemd/system/multi-user.target.wants
ls -l

wants目錄
可以看到是一些軟鏈接文件。根據前面service文件解釋,wants觸發啓動列出的每個 Unit 模塊,而不去考慮這些模塊啓動是否成功。wants 目錄應該是target 要啓動的所有unit。裏面有剛纔加入的 nginx.service
再次查看multi-user的依賴。可以發現有 nginx了
依賴

查看總體運行情況

其他的配置文件 感覺不常用,我也不知道怎麼用。。。就不提了。查看一下總體unit的情況。

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

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

command 有:

  • list-units:列出當前已經啓動的 unit,如果添加 -all 選項會同時列出沒有啓動的 unit。
  • list-unit-files:根據 /lib/systemd/system/ 目錄內的文件列出所有的 unit。還可以通過這個查看unit是否開機啓動

–type=TYPE:可以過濾某個類型的 unit。比如service/target/

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

systemctl 
systemctl list-units 

效果一致。
列出所有的units查看狀態

systemctl list-units --all

列出所有已啓動的 target

systemctl list-units --type=target

列出所有的unit。查看是否開機啓動

 systemctl list-unit-files 

傳統命令init,poweroff,halt,reboot都成爲systemctl的軟鏈接
關機:systemctl halt、systemctl poweroff
重啓:systemctl reboot
掛起:systemctl suspend
休眠:systemctl hibernate
休眠並掛起:systemctl hybrid-sleep

大致如此,由於個人都不太理解。因此這篇博客更多是供自己複習使用,待有了更深的認識,可能要重新修改。

參考資料太多,可能沒有一一貼全。
https://www.cnblogs.com/isme-zjh/p/11685233.html
https://blog.csdn.net/skh2015java/article/details/94012643
https://www.cnblogs.com/shijingjing07/p/9301590.html
https://www.pianshen.com/article/61511272363/
https://www.jianshu.com/p/a740255a9b69
https://blog.csdn.net/u011314255/article/details/80314003

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