如何創建Systemd服務
1、Systemd服務 腳本一般存放在:/usr/lib/systemd 目錄下, 目錄下又有user和system之分
/usr/lib/systemd/system # 系統服務,開機不需要登錄就能運行的程序(相當于開機自啟)
/usr/lib/systemd/user # 用戶服務,需要登錄后才能運行的程序
2、在/usr/lib/systemd/system或/usr/lib/systemd/user創建“your-service.service”文件并寫入如下示例
[Unit]
Description=<description about this service>
[Service]
User=<user e.g. root>
WorkingDirectory=<directory_of_script e.g. /root>
ExecStart=<script which needs to be executed>
Restart=always
[Install]
WantedBy=multi-user.target
3、保存后執行:
sudo systemctl daemon-reload #重新加載服務
4、啟動服務:
sudo systemctl start your-service.service
5、查看服務狀態:
sudo systemctl status your-service.service
6、設置服務開啟啟動:
sudo systemctl enable your-service.service
7、停止服務:
sudo systemctl disable your-service.service
腳本參數說明
[Unit]模塊參數
Description
簡單的服務描述
Documentation
文檔鏈接,多個文檔用空格隔開,支持以下協議文檔http://, https://, file:, info:, man:.
Requires
配置需要依賴的服務。如果本服務已經啟動,那么依賴服務肯定也已經全部啟動。如果依賴服務中有任何一個服務啟動失敗,那么systemd不會啟動本服務。多個依賴服務用空格隔開。
Wants
與Requires類似,但是這里設定的服務啟動失敗不會影響本服務啟動。
BindsTo
與Requires類似,但是如果依賴服務關閉,那么本服務也會停止。
PartOf
與Requires類似,但是依賴服務停止和重啟也同樣會停止和重啟本服務。
Conflicts
設定沖突服務,如果設定的服務已經啟動,那么本服務將不會啟動。多個服務用空格隔開。
Before, After
設定在本服務啟動“前”、“后”需要啟動的服務。多個服務用空格隔開。
OnFailure
設定如果本服務發生錯誤,需要啟動的服務。多個服務用空格隔開。
[Service]模塊參數
Type
字段定義啟動類型。它可以設置的值如下。
- simple(默認值):ExecStart字段啟動的進程為主進程
- forking:ExecStart字段將以fork()方式啟動,此時父進程將會退出,子進程將成為主進程
- oneshot:類似于simple,但只執行一次,Systemd 會等它執行完,才啟動其他服務
- dbus:類似于simple,但會等待 D-Bus 信號后啟動
- notify:類似于simple,啟動結束后會發出通知信號,然后 Systemd 再啟動其他服務
- idle:類似于simple,但是要等到其他任務都執行完,才會啟動該服務。一種使用場合是為讓該服務的輸出,不與其他服務的輸出相混合
RemainAfterExit
是否在服務所有進程都退出時還認為該服務在啟動狀態,默認為否。
GuessMainPID
A boolean value that specifies whether systemd should guess the main PID of a service if it cannot be determined reliably. This option is ignored unless Type=forking is set and PIDFile is not set. Defaults to yes.
PIDFile
設置一個絕對路徑的文件來存儲服務的PID。
An absolute filename pointing to the PID file of this daemon. Use of this option is recommended for services where Type=forking. Systemd reads the PID of the main process of the daemon after start-up of the service. Systemd does not write to the file configured here, although it removes the file after the service has shut down.
ExecStart
定義啟動進程時執行的命令。
ExecStartPre, ExecStartPost
啟動服務之前(之后)執行的命令。
ExecReload
重啟服務時執行的命令。
ExecStop
停止服務時執行的命令。
ExecStopPost
停止服務之后執行的命令。
RestartSec
在重啟服務之前等待時間。
TimeoutStartSec
等待服務啟動的時間。
TimeoutStopSec
等待服務停止的時間。
TimeoutSec
該參數設置后同時設置TimeoutStartSec 和 TimeoutStopSec參數。
RuntimeMaxSec
服務最長啟動時間。默認是無限制。
Restart
服務退出或者被kill掉后是否重新啟動
- no(默認值):退出后不會重啟
- on-success:只有正常退出時(退出狀態碼為0),才會重啟
- on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,才會重啟
- on-abnormal:只有被信號終止和超時,才會重啟
- on-abort:只有在收到沒有捕捉到的信號終止時,才會重啟
- on-watchdog:超時退出,才會重啟
- always:不管是什么退出原因,總是重啟
WorkingDirectory
指定服務執行的根目錄
[Install]模塊參數
WantedBy
通常是定義哪些target能夠運行服務一般是multi-user.target
參考:
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
https://www.freedesktop.org/software/systemd/man/systemd.exec.html#WorkingDirectory=
https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/#_unit_parameters
所有參數設置參考:
https://www.freedesktop.org/software/systemd/man/systemd.directives.html