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