簡介
Linux 系統的 init 進程經歷了兩次重大的演進,傳統的 sysvinit 已經逐漸淡出歷史舞臺,新的 UpStart 和 systemd 各有特點,越來越多的 Linux 發行版采納了 systemd
特性:
- 更快的啟動速度
- Systemd 提供了比 UpStart 更激進的并行啟動能力,采用了 socket / D-Bus activation 等技術啟動服務
- 為了減少系統啟動時間,systemd 的目標是
- 盡可能啟動更少的進程
- 盡可能將更多進程并行啟動
- 自帶日志服務
- systemd 自帶日志服務 journald,該日志服務的設計初衷是克服現有的 syslog 服務的缺點。
- syslog 不安全,并且數據沒有嚴格的格式。
- Systemd Journal 用二進制格式保存所有日志信息,用戶使用 journalctl 命令來查看日志信息
- Systemd Journal 的主要優點如下
- 零維護:日志是除錯和監控系統的核心功能,因此它自己不能再產生問題。舉例說,自動管理磁盤空間,避免由于日志的不斷產生而將磁盤空間耗盡。
- 最小資源占用:日志 數據文件需要較小。
編寫服務
編寫一個systemctl服務的步驟如下:
- 創建一個新的服務單元文件,通常位于/etc/systemd/system/目錄下。文件名應該以.service結尾,例如my-service.service。
- 編輯服務單元文件,添加以下內容:
[Unit]
Description=我的自定義服務
After=network.target   #指定了服務啟動順序,在network.target服務啟動后,再啟動當前服務
[Service]
# Type:字段定義啟動類型,可以設置的值如下:
# simple(默認值):ExecStart 字段啟動的進程為主進程,即直接啟動服務進程。
# forking:ExecStart 字段將以 fork() 方式啟動,此時父進程將會退出,子進程將成為主進程(例如用 shell 腳本啟動服務進程)。
Type=simple
User=USER               # 設置服務運行的用戶
Group=USER              # 設置服務運行的用戶組
WorkingDirectory=/PATH  # 設置服務運行的路徑(cwd)
ExecStart=/usr/bin/my-service-command		# 服務啟動命令,命令需要絕對路徑
Restart=on-failure
[Install]
# systemd提供了一些默認的目標(target),如multi-user.target、graphical.target等
WantedBy=multi-user.target其中,
- [Unit]:設置啟動順序
- Description字段描述了服務的功能,
- After字段指定了服務啟動順序,在network.target服務啟動后,再啟動當前服務
- [Service]:設置啟動行為
- Type字段定義了服務的類型,
- User字段指定了運行服務的用戶,
- ExecStart字段指定了啟動服務的命令,
- Restart字段定義了服務失敗時的重啟策略,
- [Install]:服務安裝到哪個場景:命令行還是圖形界面
- WantedBy字段指定了服務所屬的目標。
- 保存并關閉服務單元文件。
- 重新加載systemd配置,使新的服務生效:
sudo systemctl daemon-reload- 啟動新創建的服務:
sudo systemctl start my-service.service- 檢查服務的狀態:
sudo systemctl status my-service.service- 如果需要,可以將服務設置為開機自啟動:
sudo systemctl enable my-service.service- 如果需要停止或禁用服務,可以使用以下命令:
sudo systemctl stop my-service.service
sudo systemctl disable my-service.service
常用命令
啟動/停止/重啟服務
sudo systemctl start serviceName
sudo systemctl stop serviceName
sudo systemctl restart serviceName狀態查詢
# 列出所有正在運行的服務
systemctl list-units --type=service --state=active
# 狀態查詢
systemctl status serviceName
# 檢查服務是否啟用
systemctl is-enabled serviceName查默認日志
# 查看服務日志,查看名為 serviceName 的服務的日志,以檢查啟動問題
sudo journalctl -u serviceName
查更詳細日志
編輯服務配置文件
sudo systemctl edit serviceName[Service]
Environment=SYSTEMD_LOG_LEVEL=debug然后重新加載 systemd 并啟動服務,以獲得詳細的啟動日志:
sudo systemctl daemon-reload
sudo systemctl restart serviceName常見問題
service文件放哪個目錄?
- /etc/systemd/system/
- 這個目錄專門用于存放用戶自定義的服務單元文件
- /usr/lib/systemd/system/
- 這個目錄通常包含由軟件包安裝的服務單元文件。不過,用戶創建的服務單元文件應該放在/etc/systemd/system/目錄下,以避免在升級系統時被覆蓋。
啟動順序一般After哪個?
- 看具體情況,一般After=network.target 可以滿足大部分場景(服務在網絡服務正常后,再啟動當前服務)