systemd service unit
本文於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 strikes again : Unit X.mount is bound to inactive unitAI
- systemd 和 如何修改和建立一個 systemd service (Understanding and administering systemd)
- Failed to start docker.service: Unit not foundAIDocker
- Centos系統中 Systemd 的Unit檔案配置說明CentOS
- Centos7 中 Systemd 的Unit檔案配置說明CentOS
- mysql中出現Unit mysql.service could not be found 的解決方法MySql
- systemd - yocto linux如何整合&配置systemdLinux
- systemd - Android系統如何整合&配置systemdAndroid
- Unit test
- systemd工具集
- systemd的作用
- [Unit testing Vue]Vue
- mysql服務啟動報錯Redirecting to systemctl start mysqld.serviceFailed to start mysqld.service:Unit not found.MySqlAI
- [Vue Unit tesitng] SnapshotVue
- unit原子距離
- unit-test框架框架
- [20230322]mount systemd.txt
- Linux:使用systemd管理程式Linux
- Systemd簡介與使用
- 使用 systemd 執行 Horizon
- Systemd 定時器教程定時器
- 使用systemd部署r-nacos
- 利用 systemd 部署 golang 專案Golang
- Linux守護程式及SystemdLinux
- systemd程式管理工具
- Systemd設定程式保護
- pytest與unit test區別
- mormot.core.threads.pas unitORMthread
- unit3 文字聚類聚類
- WSL2安裝systemd方法
- [轉]Systemd 入門教程:命令篇
- 如何建立systemd定時任務
- 通過 Systemd Journal 收集日誌
- [Vue Unit tesing] Testing API Calls (mocking)VueAPIMock
- 用 ai 自動生成 unit testAI
- SAP HANA Delivery Unit概念簡述
- 使用 restic 和 systemd 自動備份REST
- RocketMQ系列:使用systemd管理nameserver和brokerMQServer