systemd詳解


CentOS 7繼承了RHEL 7的新的特性,例如強大的systemd, 而systemd的使用也使得以往系統服務的/etc/init.d的啟動腳本的方式就此改變, 也大幅提高了系統服務的運行效率。但服務的配置和以往也發生了極大的不同,同時變的簡單而易用了許多。

CentOS 7的服務systemctl腳本存放在:/usr/lib/systemd/,有系統 system 和用戶 user 之分, 即:/usr/lib/systemd/system/usr/lib/systemd/user

配置文件

這里我們先要說明一下unit的文件位置,一般主要有三個目錄:

/lib/systemd/system
/run/systemd/system
/etc/systemd/system

這三個目錄的配置文件優先級依次從低到高,如果同一選項三個地方都配置了,優先級高的會覆蓋優先級低的。 系統安裝時,默認會將unit文件放在/lib/systemd/system目錄。如果我們想要修改系統默認的配置,比如nginx.service,一般有兩種方法:

  1. /etc/systemd/system目錄下創建nginx.service文件,里面寫上我們自己的配置。
  2. /etc/systemd/system下面創建nginx.service.d目錄,在這個目錄里面新建任何以.conf結尾的文件,然后寫入我們自己的配置。推薦這種做法。

/run/systemd/system這個目錄一般是進程在運行時動態創建unit文件的目錄,一般很少修改,除非是修改程序運行時的一些參數時,即Session級別的,才在這里做修改。

服務配置

每一個服務以.service結尾,一般會分為3部分:[Unit]、[Service]和[Install],就以nginx為例吧,具體內容如下:

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

配置項說明

下面分別解釋下着三部分的含義

[Unit]

  • Description : 服務的簡單描述
  • Documentation : 服務文檔
  • After= : 依賴,僅當依賴的服務啟動之后再啟動自定義的服務單元

[Service]

  • Type : 啟動類型simple、forking、oneshot、notify、dbus
    • Type=simple(默認值):systemd認為該服務將立即啟動,服務進程不會fork。如果該服務要啟動其他服務,不要使用此類型啟動,除非該服務是socket激活型
    • Type=forking:systemd認為當該服務進程fork,且父進程退出后服務啟動成功。對於常規的守護進程(daemon),除非你確定此啟動方式無法滿足需求, 使用此類型啟動即可。使用此啟動類型應同時指定PIDFile=,以便systemd能夠跟蹤服務的主進程。
    • Type=oneshot:這一選項適用於只執行一項任務、隨后立即退出的服務。可能需要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出之后仍然認為服務處於激活狀態。
    • Type=notify:與 Type=simple 相同,但約定服務會在就緒后向 systemd 發送一個信號,這一通知的實現由 libsystemd-daemon.so 提供
    • Type=dbus:若以此方式啟動,當指定的 BusName 出現在DBus系統總線上時,systemd認為服務就緒。
  • PIDFile : pid文件路徑
  • ExecStartPre :啟動前要做什么,上文中是測試配置文件 -t
  • ExecStart:啟動
  • ExecReload:重載
  • ExecStop:停止
  • PrivateTmp:True表示給服務分配獨立的臨時空間

[Install]

  • WantedBy:服務安裝的用戶模式,從字面上看,就是想要使用這個服務的有是誰?上文中使用的是:multi-user.target ,就是指想要使用這個服務的目錄是多用戶。

每一個.target實際上是鏈接到我們單位文件的集合,當我們執行

systemctl enable nginx.service

就會在 /etc/systemd/system/multi-user.target.wants/ 目錄下新建一個 /usr/lib/systemd/system/nginx.service 文件的鏈接。

操作示例

下面是幾個最常用的service操作:

# 自啟動
systemctl enable nginx.service
# 禁止自啟動
systemctl disable nginx.service
# 啟動服務
systemctl start nginx.service
# 停止服務
systemctl stop nginx.service
# 重啟服務
systemctl restart nginx.service

# 查看Unit定義文件
systemctl cat nginx.service
# 編輯Unit定義文件
systemctl edit nginx.service
# 重新加載Unit定義文件
systemctl reload nginx.service

# 列出已啟動的所有unit,就是已經被加載到內存中
systemctl list-units
# 列出系統已經安裝的所有unit,包括那些沒有被加載到內存中的unit
systemctl list-unit-files

# 查看服務的日志
journalctl -u nginx.service    # 還可以配合`-b`一起使用,只查看自本次系統啟動以來的日志

# 查看所有target下的unit
systemctl list-unit-files --type=target

# 查看默認target,即默認的運行級別。對應於舊的`runlevel`命令
systemctl get-default

# 設置默認的target
systemctl set-default multi-user.target

# 查看某一target下的unit
systemctl list-dependencies multi-user.target

# 切換target,不屬於新target的unit都會被停止
systemctl isolate multi-user.target

systemctl poweroff    # 關機
systemctl reboot       # 重啟
systemctl rescue    # 進入rescue模式

轉:https://www.xncoding.com/2016/06/07/linux/systemd.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM