如何玩轉(zhuǎn) systemd:從基礎(chǔ)到進(jìn)階
一、概述
systemd是一個(gè)系統(tǒng)和服務(wù)管理器,systemd是Linux系統(tǒng)中一套基本的構(gòu)建模塊,提供了一系列工具的集合,用于管理后臺(tái)服務(wù)、狀態(tài)查詢、日志歸檔、設(shè)備管理、電源管理和定時(shí)任務(wù)等許多職責(zé)。
systemd作為PID為1的進(jìn)程,是系統(tǒng)中所有其他進(jìn)程的父進(jìn)程。
systemctl是一個(gè)命令行工具,用于與systemd進(jìn)行交互。通過(guò)systemctl,用戶可以啟動(dòng)、停止、重啟、查看狀態(tài)以及管理系統(tǒng)中的服務(wù)單元
systemd作為后臺(tái)服務(wù)運(yùn)行,而systemctl則提供了用戶與systemd交互的接口。用戶通過(guò)systemctl發(fā)送指令,systemd執(zhí)行相應(yīng)的操作
systemctl的命令實(shí)際上是向systemd發(fā)送請(qǐng)求,告訴systemd要做什么。
systemd通過(guò)單元文件(Unit files)來(lái)描述和管理不同的系統(tǒng)資源和服務(wù)。Systemd 支持 12 種 Unit 文件類(lèi)型。下面就將我們生產(chǎn)環(huán)境中常用到的Service單元文件展開(kāi)講解。
二、service文件
定義軟件服務(wù)的文件通常是systemd服務(wù)單元文件,具有.service后綴,這些文件通常位于以下目錄:
# 系統(tǒng)或用戶自定義的配置文件
/etc/systemd/system/
# 軟件運(yùn)行時(shí)生成的配置文件
/run/systemd/system
# 系統(tǒng)或第三方軟件安裝時(shí)添加的配置文件。
/usr/lib/systemd/system
Systemd 默認(rèn)從目錄 /etc/systemd/system/ 讀取配置文件。但是,里面存放的大部分文件都是符號(hào)鏈接,指向目錄 /usr/lib/systemd/system/,真正的配置文件存放在那個(gè)目錄。
1. service組成部分
service文件主要三大模塊:
[Unit]: #定義與Unit類(lèi)型無(wú)關(guān)的通用選項(xiàng),用于提供unit的描述信息、unit行為及依賴關(guān)系等
[Service]: #定義如何啟動(dòng)、停止、重啟當(dāng)前服務(wù)。
[Install]: #定義如何安裝這個(gè)配置文件,即怎樣做到開(kāi)機(jī)啟動(dòng)。
2. Unit部分
Description: # 對(duì)服務(wù)的簡(jiǎn)單描述
After: # 在哪些服務(wù)之后啟動(dòng)
Before: # 在哪些服務(wù)器啟動(dòng)之前啟動(dòng)
Requires: # 可以指定服務(wù)依賴于哪些服務(wù)(強(qiáng)依賴)
Wants: # 可以指定服務(wù)依賴于哪些服務(wù)(弱依賴)
3. Service部分
EnvironmentFile: # 指定當(dāng)前服務(wù)啟動(dòng)的環(huán)境變量
ExecStart: # 指定服務(wù)啟動(dòng)時(shí)執(zhí)行的命令或腳本
ExecStop: # 指明停止服務(wù)要運(yùn)行的命令或腳本
RestartSec: # 指定服務(wù)在重啟時(shí)等待的時(shí)間,單位為秒
ExecReload: # 指明重啟服務(wù)要運(yùn)行的命令或腳本
Restart: # 重啟設(shè)置
KillMode: # 指定停止的方式
Restart: # 指定重啟時(shí)的類(lèi)型
Type: # 指定啟動(dòng)類(lèi)型,
type的可選值:
simple # 指定ExecStart字段的進(jìn)程為主進(jìn)程
forking # 指定以fork() 子進(jìn)程執(zhí)行ExecStart字段的進(jìn)程
oneshot # 執(zhí)行一次
notify # 啟動(dòng)后發(fā)送會(huì)發(fā)送通知信號(hào)通知systemd
idle # 等其他任務(wù)結(jié)束后才運(yùn)行
Restart的可選值:
no: # 退出后不會(huì)重啟
on-success: # 當(dāng)進(jìn)程正常退出時(shí)(退出碼為0) 執(zhí)行重啟
on-failure: # 當(dāng)進(jìn)程不正常退出時(shí)(退出碼不為0) 執(zhí)行重啟
on-abnormal: # 當(dāng)被信號(hào)終止和超時(shí)執(zhí)行重啟on-abort: 當(dāng)收到?jīng)]有捕捉到的信號(hào)終止時(shí)執(zhí)行重啟
on-watchdog: # 當(dāng)看門(mén)狗超時(shí)時(shí)執(zhí)行重啟
always: # 一直重啟
KillMode可選值:
control-group: # 殺掉當(dāng)前進(jìn)程中所有的進(jìn)程
process: # 殺掉當(dāng)前進(jìn)程的主進(jìn)程
mixed: # 主進(jìn)程將收到 SIGTERM 信號(hào),子進(jìn)程收到 SIGKILL 信號(hào)
none: # 不殺掉任何進(jìn)程
4. Install部分
Alias: # 別名,可使用systemctl command Alias.service
RequiredBy: # 被哪些units所依賴,強(qiáng)依賴
WantedBy: # 被哪些units所依賴,弱依賴
Also: # 安裝本服務(wù)的時(shí)候還要安裝別的相關(guān)服務(wù)
Install: # 一般填為WantedBy=multi-user.target
三、service文件樣例
將自己部署的nginx注冊(cè)為系統(tǒng)服務(wù):
[Unit]Description=The nginx web and reverse proxy server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
#啟動(dòng)檢測(cè)命令
ExecStartPre=/data/nginx/sbin/nginx -t
#啟動(dòng)命令
ExecStart=/data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf
#重載配置文件命令
ExecReload=/data/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/data/nginx/sbin/nginx -s quit
[Install]
WantedBy=multi-user.target
將部署的mysql注冊(cè)為系統(tǒng)服務(wù):
[Unit]
Description=Mysql
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
#指定PID文件
PIDFile=/data/mysql/data/centos-linux.shared.pid
#啟動(dòng)MySQL
ExecStart=/data/mysql/support-files/mysql.server start
#重載
ExecReload=/bin/kill -s HUP $MAINPID
#停止服務(wù)
ExecStop=/data/mysql/support-files/mysql.server
stopPrivateTmp=false
[Install]
WantedBy=multi-user.target
四、systemctl命令合集
#啟動(dòng)服務(wù)
systemctl start name.service
#停止服務(wù)
systemctl stop name.service
#重啟服務(wù)
systemctl restart name.service
#查看服務(wù)狀態(tài)
systemctl status name.service
#禁止自動(dòng)和手動(dòng)啟動(dòng)
systemctl mask name.service
#取消禁止
systemctl unmask name.service
#查看某服務(wù)當(dāng)前激活與否的狀態(tài)
systemctl is-active name.service
#查看所有已經(jīng)激活的服務(wù)
systemctl list-units --type|-t service
#查看所有服務(wù)
systemctl list-units --type service --all
#設(shè)定某服務(wù)開(kāi)機(jī)自啟,相當(dāng)于chkconfig name on
systemctl enable name.service
#設(shè)定某服務(wù)開(kāi)機(jī)禁止啟動(dòng):相當(dāng)于chkconfig name off
systemctl disable name.service
#查看所有服務(wù)的開(kāi)機(jī)自啟狀態(tài),相當(dāng)于chkconfig --list
systemctl list-unit-files --type service
#用來(lái)列出該服務(wù)在哪些運(yùn)行級(jí)別下啟用和禁用:chkconfig –list namels /etc/systemd/system/*.wants/name.service
#查看服務(wù)是否開(kāi)機(jī)自啟
systemctl is-enabled name.service
#列出失敗的服務(wù)
systemctl --failed --type=service
#查看服務(wù)的依賴關(guān)系
systemctl list-dependencies name.service
#殺掉進(jìn)程
systemctl kill unitname
#重新加載配置文件
systemctl daemon-reload
#關(guān)機(jī)
systemctl halt
#重啟服務(wù)器
systemctl reboot