參考:
https://www.qingheluo.com/systemdzhongdepeizhiwenjian/
簡介:
CentOS 7 使用systemd替換了SysV。Systemd目的是要取代Unix時代以來一直在使用的init系統,兼容SysV和LSB的啟動腳本,而且夠在進程啟動過程中更有效地引導加載服務。
systemd的特性有:
- 支持並行化任務
- 同時采用socket式與D-Bus總線式激活服務;
- 按需啟動守護進程(daemon);
- 利用 Linux 的 cgroups 監視進程;
- 支持快照和系統恢復;
- 維護掛載點和自動掛載點;
- 各服務間基於依賴關系進行精密控制。
systemd里的重要概念:
單元:
一個單元配置文件可以描述如下內容之一:系統服務(.service)、掛載點(.mount)、sockets(.sockets) 、系統設備(.device)、交換分區(.swap)、文件路徑(.path)、啟動目標(.target)、由 systemd 管理的計時器(.timer)。詳情參閱 man 5 systemd.unit。
使用 systemctl 控制單元時,通常需要使用單元文件的全名,包括擴展名(例如 sshd.service)。但是有些單元可以在systemctl中使用簡寫方式。
- 如果無擴展名,systemctl 默認把擴展名當作 .service。例如 netcfg 和 netcfg.service 是等價的。
- 掛載點會自動轉化為相應的 .mount 單元。例如 /home 等價於 home.mount。
- 設備會自動轉化為相應的 .device 單元,所以 /dev/sda2 等價於 dev-sda2.device。
單元控制項:
systemctl stop|start|restart|reload|is-enabled|enable|disable|daemon-reload 單元名稱
編寫單元文件(也就是服務文件,這里只對服務文件做示例)
路徑 | systemd控制的相關文件的作用 |
---|---|
/usr/lib/systemd/system/ | 服務啟動的腳本啟動路徑 |
/etc/systemd/system/multi-user.target.wants/ | 開機自啟服務存放路 |
etc/systemd/system/default.target | 默認運行級別配置文件 |
- 每一個Unit都需要有一個配置文件用於告知systemd對於服務的管理方式
- 配置文件存放於/usr/lib/systemd/system/,設置開機啟動后會在/etc/systemd/system目錄建立軟鏈接文件
- 每個Unit的配置文件配置默認后綴名為.service
- 在/usr/lib/systemd/system/目錄中分為system和user兩個目錄,一般將開機不登陸就能運行的程序存在系統服務里,也就是/usr/lib/systemd/system
- 配置文件使用方括號分成了多個部分,並且區分大小寫
配置單元(服務)文件模板:
nginx
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
tomcat
[Unit]
Description=tomcat
After=network.target
[Service]
Type=forking
Environment="export JAVA_HOME=/opt/jdk"
Environment="export JAVA_BIN=$JAVA_HOME/bin"
Environment="export JRE_HOME=$JAVA_HOME/jre"
Environment="export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib"
Environment="export PATH=$PATH:$JAVA_HOME/bin"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
該文件內容只要分為三個部分 Unit Service
Install,Server這段要根據Unit(單元)的類型來確定
Unit:
- Description:描述信息
- After:表明需要依賴的服務,作用決定啟動順序
- Before:表明被依賴的服務
- Requles:依賴到的其他unit ,強依賴,即依賴的unit啟動失敗。該unit不啟動。
- Wants:依賴到的其他unit,弱依賴,即依賴的unit 啟動失敗。該unit繼續啟動
- Conflicts:定義沖突關系
處理依賴關系
使用systemd時,可通過正確編寫單元配置文件來解決其依賴關系。典型的情況是,單元A要求單元B在A啟動之前運行。在此情況下,向單元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依賴關系是可選的,可添加 Wants=B 和 After=B。
請注意 Wants= 和 Requires= 並不意味着 After=,即如果 After= 選項沒有制定,這兩個單元將被並行啟動。
依賴關系通常被用在服務(service)而不是目標(target)上。例如, network.target 一般會被某個配置網絡接口的服務引入,所以,將自定義的單元排在該服務之后即可,因為 network.target 已經啟動。
Server:
- Type:
simple:默認值,執行ExecStart指定的命令,啟動主進程
forking:以 fork 方式從父進程創建子進程,創建后父進程會立即退出,子進程將成為主進程
oneshot:一次性進程,類似於simple,但只執行一次,Systemd 會等當前服務退出,再繼續往下執行
dbus:當前服務通過D-Bus啟動,類似於simple,但會等待 D-Bus 信號后啟動
notify:當前服務啟動完畢,會發出通知信號通知Systemd,然后 Systemd 再繼續啟動其他服務
idle:類似於simple,但是要等到其他任務都執行完畢,才會啟動該服務。一種使用場合是為讓該服務的輸出,不與其他服務的輸出相混合
-
User:指定開機自動運行該程序的用戶名
-
Group:指定開機自動運行該程序的用戶組
-
LimitCORE=infinity:限制內核文件的大小
-
LimitNOFILE=65536:服務最大允許打開的文件描述符數量
-
LimitNPROC=65536:進程的最大數量
-
PIDFile:指定開機自動運行該程序的pid文件(一般在程序配置文件中配置該項)
-
ExecStart:啟動當前服務的命令
-
ExecStartPre:啟動當前服務之前執行的命令
-
ExecStartPost:啟動當前服務之后執行的命令
-
ExecReload:重啟當前服務時執行的命令
-
ExecStop:停止當前服務時執行的命令
-
ExecStopPost:停止當其服務之后執行的命令
-
KillMode:定義如何停止服務。KillMode字段可以設置的值如下control-group(默認值):當前控制組里面的所有子進程,都會被殺掉;process:只殺主進程;mixed:主進程將收到SIGTERM信號,子進程收到SIGKILL信號;none:沒有進程會被殺掉,只是執行服務的stop命令。如ssh服務將KillMode設為process,不停止任何sshd子進程,即子進程打開的SSH session仍然保持連接,這個設置不太常見,但對 sshd 很重要,否則你停止服務的時候,會連自己打開的 SSH session一起殺掉。
-
RestartSec:自動重啟當前服務等待的秒數
-
Restart:定義了當前服務退出后,Systemd的重啟方式,可能的值包括no(默認值):退出后不會重啟;always:不管是什么退出原因,總是重啟;on-success:只有正常退出時(退出狀態碼為0),才會重啟;on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,才會重啟;on-abnormal:只有被信號終止和超時,才會重啟;on-abort:只有在收到沒有捕捉到的信號終止時,才會重啟;on-watchdog:超時退出,才會重啟,如ssh服務設置為on-failure,表示任何意外的失敗,就將重啟sshd。如果sshd正常停止(比如執行systemctl stop命令),它就不會重啟。
-
RemainAfterExit:值為yes或no,表示進程退出以后,服務仍然保持執行。這樣的話,一旦使用systemctl stop命令停止服務,ExecStop指定的命令就會執行
-
TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
-
Environment:指定當前服務的環境變量
-
EnvironmentFile:指定當前服務的環境參數文件,該文件的key=value鍵值對,可以用$key的形式,在當前配置文件中獲取
-
所有的啟動設置都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行。比如,EnvironmentFile=-/etc/sysconfig/sshd,表示即使/etc/sysconfig/sshd文件不存在,也不會拋出錯誤。
-
PrivateTmp 的值設置成true ,服務啟動時會在/tmp目錄下生成類似systemd-private-433ef27ba3d46d8aac286aeb1390e1b-nginx.service-RedVyu的文件夾,用於存放nginx的臨時文件。
Install:
- WantedBy:它的值是一個或多個 Target,當前 Unit 激活時(enable)符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .wants后綴構成的子目錄中
- RequiredBy:它的值是一個或多個 Target,當前 Unit 激活時,符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .required后綴構成的子目錄中
- Alias:當前 Unit 可用於啟動的別名
- Also:當前 Unit 激活(enable)時,會被同時激活的其他 Unit