Systemd 添加自定義服務(開機自啟動)


Systemd 簡介:https://fedoraproject.org/wiki/Systemd/zh-cn

管理自啟動服務(空格取消選中,按 TAB 切換確定):ntsysv

一、service unit 常用命令,以 mysql 服務為例

# 開機啟動
systemctl enable mysqld

# 關閉開機啟動
systemctl disable mysqld

# 啟動服務
systemctl start mysqld

# 停止服務
systemctl stop mysqld

# 重啟服務
systemctl restart mysqld

# 查看服務狀態
systemctl status mysqld
systemctl is-active sshd.service

# 結束服務進程(服務無法停止時)
systemctl kill mysqld

 

二、服務啟動的配置文件

配置文件主要放在 /usr/lib/systemd/system 目錄,也可能在 /etc/systemd/system 目錄

# 查看 sshd 服務啟動文件
systemctl cat sshd.service

# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

每個服務文件以 .service 結尾,一般會分為 3 部分,必須包含 [Service] 部分

[Unit] 啟動順序與依賴關系

Description:當前服務的簡單描述
Documentation:指定 man 文檔位置

After:如果 network.target 或 sshd-keygen.service 需要啟動,那么 sshd.service 應該在它們之后啟動
Before:定義 sshd 應該在哪些服務之前啟動
注意:After 和 Before 字段只涉及啟動順序,不涉及依賴關系。

Wants:表示 sshd.service 與 sshd-keygen.service 之間存在"弱依賴"關系,即如果"sshd-keygen.service"啟動失敗或停止運行,不影響 sshd.service 繼續執行
Requires:表示"強依賴"關系,即如果該服務啟動失敗或異常退出,那么sshd.service 也必須退出
注意:Wants 字段與 Requires 字段只涉及依賴關系,與啟動順序無關,默認情況下是同時啟動。

[Service] 啟動行為

EnvironmentFile:許多軟件都有自己的環境參數文件,該字段指定文件路徑
注意:/etc/profile 或者 /etc/profile.d/ 這些文件中配置的環境變量僅對通過 pam 登錄的用戶生效,而 systemd 是不讀這些配置的。
systemd 是所有進程的父進程或祖先進程,它的環境變量會被所有的子進程所繼承,如果需要給 systemd 配置默認參數可以在 /etc/systemd/system.conf  和 /etc/systemd/user.conf 中設置。
加載優先級 system.conf 最低,可能會被其他的覆蓋。 Type:定義啟動類型。可設置:simple,exec,forking,oneshot,dbus,notify,idle simple(設置了 ExecStart= 但未設置 BusName= 時的默認值):ExecStart 字段啟動的進程為該服務的主進程 forking:ExecStart 字段的命令將以 fork() 方式啟動,此時父進程將會退出,子進程將成為主進程 ExecStart:定義啟動進程時執行的命令 上面的例子中,啟動 sshd 執行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的變量 $OPTIONS 就來自 EnvironmentFile 字段指定的環境參數文件。類似的,還有如下字段: ExecReload:重啟服務時執行的命令 ExecStop:停止服務時執行的命令 ExecStartPre:啟動服務之前執行的命令 ExecStartPost:啟動服務之后執行的命令 ExecStopPost:停止服務之后執行的命令 RemainAfterExit:設為yes,表示進程退出以后,服務仍然保持執行 KillMode:定義 Systemd 如何停止服務,可以設置的值如下: control-group(默認值):當前控制組里面的所有子進程,都會被殺掉 process:只殺主進程 mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號 none:沒有進程會被殺掉,只是執行服務的 stop 命令 Restart:定義了退出后,Systemd 的重啟方式。可以設置的值如下: no(默認值):退出后不會重啟 on-success:只有正常退出時(退出狀態碼為0),才會重啟 on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,才會重啟 on-abnormal:只有被信號終止和超時,才會重啟 on-abort:只有在收到沒有捕捉到的信號終止時,才會重啟 on-watchdog:超時退出,才會重啟 always:不管是什么退出原因,總是重啟 RestartSec:表示 Systemd 重啟服務之前,需要等待的秒數

 

配置中多個相同配置會選擇最后一個,下面結果是 execstart2

[Service]

ExecStart=/bin/echo execstart1

ExecStart=/bin/echo execstart2

 

所有的啟動設置之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行

EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 文件不存在,也不會拋出錯誤

[Install]

WantedBy:表示該服務所在的 Target(服務組)

關於 Target,運行級別

# 查看默認 Target
systemctl get-default
# 結果為 multi-user.target,表示默認的啟動 Target 是multi-user.target。在這個組里的所有服務,都將開機啟動。這就是為什么 systemctl enable 命令能設置開機啟動的原因

# 查看 multi
-user.target 包含的所有服務 systemctl list-dependencies multi-user.target # 切換到另一個 target # shutdown.target 就是關機狀態 # 常用的 Target 有兩個:一個是 multi-user.target,表示多用戶命令行狀態;另一個是 graphical.target,表示圖形用戶狀態,它依賴於 multi-user.target systemctl isolate shutdown.target

 

三、自定義服務

在 /usr/lib/systemd/system 下新建服務腳本

vim /usr/lib/systemd/system/zdy.service

[Unit]
Description=描述
Environment=環境變量或參數(系統環境變量此時無法使用)
After=network.target

[Service]
Type=forking
EnvironmentFile=所需環境變量文件或參數文件
ExecStart=啟動命令(需指定全路徑)
ExecStop=停止命令(需指定全路徑)
User=以什么用戶執行命令

[Install]
WantedBy=multi-user.target

新建完成后設置自啟動

# 添加或修改配置文件后,需要重新加載
systemctl daemon-reload

# 設置自啟動,實質就是在 /etc/systemd/system/multi-user.target.wants/ 添加服務文件的鏈接
systemctl enable zdy

 


官方手冊 https://www.freedesktop.org/software/systemd/man/systemd.service.html

中文翻譯 http://www.jinbuguo.com/systemd/systemd.service.html

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

https://blog.csdn.net/weixin_37766296/article/details/80192633


免責聲明!

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



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