systemd service unit

煎雞蛋湯發表於2018-03-20

本文於2018年1月4號釋出在個人部落格中,因為個人部落格關閉,全部遷移到CSDN,以下是正文:


想要自己的服務像下面這樣嗎?

systemctl enable your.service
systemctl disable your.service
systemctl start your.service
systemctl stop your.service
systemctl restart your.service
systemctl status your.service

只需要編寫一個systemd service的配置檔案即可,今天來談一談如何編寫自己的systemd service配置檔案

配置檔案格式

配置檔案由多個section組成,每個section由多個配置項組成,切section名和配置項名大小寫敏感。示例如下:

[Section]
key1=value1
key2=value2
......

sections

systemd service 配置檔案有如下section:

  • Unit
  • Service
  • Install

Unit

[Unit]區塊通常是配置檔案的第一個區塊,用來定義 Unit 的後設資料,以及配置與其他 Unit 的關係。它的主要欄位如下:

Description:簡短描述

Documentation:文件地址

Requires:當前 Unit 依賴的其他 Unit,如果它們沒有執行,當前 Unit 會啟動失敗

Wants:與當前 Unit 配合的其他 Unit,如果它們沒有執行,當前 Unit 不會啟動失敗

BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止執行

Before:如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之後啟動

After:如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之前啟動

Conflicts:這裡指定的 Unit 不能與當前 Unit 同時執行

Condition...:當前 Unit 執行必須滿足的條件,否則不會執行

Assert...:當前 Unit 執行必須滿足的條件,否則會報啟動失敗

Service

[Service]區塊用來 Service 的配置,只有 Service 型別的 Unit 才有這個區塊。它的主要欄位如下:

  • Type:定義啟動時的程式行為。它有以下幾種值。
    • Type=simple:預設值,執行ExecStart指定的命令,啟動主程式
    • Type=forking:以 fork 方式從父程式建立子程式,建立後父程式會立即退出
    • Type=oneshot:一次性程式,Systemd 會等當前服務退出,再繼續往下執行
    • Type=dbus:當前服務通過D-Bus啟動
    • Type=notify:當前服務啟動完畢,會通知Systemd,再繼續往下執行
    • Type=idle:若有其他任務執行完畢,當前服務才會執行
  • ExecStart:啟動當前服務的命令
  • ExecStartPre:啟動當前服務之前執行的命令
  • ExecStartPost:啟動當前服務之後執行的命令
  • ExecReload:重啟當前服務時執行的命令
  • ExecStop:停止當前服務時執行的命令
  • ExecStopPost:停止當其服務之後執行的命令
  • RestartSec:自動重啟當前服務間隔的秒數
  • Restart:定義何種情況 Systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
  • Environment:指定環境變數

Install

[Install]通常是配置檔案的最後一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要欄位如下:

  • WantedBy:它的值是一個或多個 Target,當前 Unit 啟用時(enable)符號連結會放入/etc/systemd/system目錄下面以 Target 名 + .wants字尾構成的子目錄中
  • RequiredBy:它的值是一個或多個 Target,當前 Unit 啟用時,符號連結會放入/etc/systemd/system目錄下面以 Target 名 + .required字尾構成的子目錄中
  • Alias:當前 Unit 可用於啟動的別名
  • Also:當前 Unit 啟用(enable)時,會被同時啟用的其他 Unit

示例

systemd service配置檔案:

[root@localhost ~]# systemctl cat hello.service 
# /usr/lib/systemd/system/hello.service
[Unit]
Description=systemd service unit demo
Documentation=https://sample.com

[Service]
ExecStart=/usr/local/bin/hello

[Install]
WantedBy=multi-user.target

[Service]下的ExecStart指定service啟動命令,指向了另外一個指令碼,我們來看看內容:

[root@localhost ~]# cat /usr/local/bin/hello 
#!/bin/bash
echo "Hello, Systemd! @ $(date)" > /home/test.log

更新完systemd service配置檔案後,需要重新載入,執行命令:

systemctl daemon-reload

啟動service,命令:

systemctl start hello.service

或者:

systemctl start hello

檢視service狀態,命令:

systemctl status hello.service

或者:

systemctl status hello

設定service開機啟動,命令:

systemctl enable hello

參考文獻

Systemd 入門教程:命令篇

相關文章