1、service配置文件
每一個 Unit 都有一個配置文件,告訴 Systemd 怎么啟動這個 Unit 。
Systemd 默認從目錄/etc/systemd/system/
讀取配置文件。但是,里面存放的大部分文件都是符號鏈接,指向目錄/usr/lib/systemd/system/
,真正的配置文件存放在那個目錄。
systemctl enable
命令用於在上面兩個目錄之間,建立符號鏈接關系。
開機時,Systemd
只執行/etc/systemd/system
目錄里面的配置文件。
service文件定義了一個服務,分為[Unit],[Service],[Install]三個小節,如下
[Unit]
Description:描述,
After:在network.target,auditd.service啟動后才啟動
ConditionPathExists: 執行條件
[Service]
EnvironmentFile:變量所在文件
ExecStart: 執行啟動腳本
Restart: fail時重啟
[Install]
Alias:服務別名
WangtedBy: 多用戶模式下需要的
2、配置文件的區塊
[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 運行必須滿足的條件,否則會報啟動失敗
[Install]
通常是配置文件的最后一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要字段如下。
WantedBy:它的值是一個或多個 Target,當前 Unit 激活時(enable)符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .wants后綴構成的子目錄中 RequiredBy:它的值是一個或多個 Target,當前 Unit 激活時,符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .required后綴構成的子目錄中 Alias:當前 Unit 可用於啟動的別名 Also:當前 Unit 激活(enable)時,會被同時激活的其他 Unit
[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:指定環境變量
3、修改配置文件后重啟
修改配置文件以后,需要重新加載配置文件,然后重新啟動相關服務。
# 重新加載配置文件 $ sudo systemctl daemon-reload # 重啟相關服務 $ sudo systemctl restart foobar
4、服務管理
systemctl start 服務名 開啟服務 systemctl stop 服務名 關閉服務 systemctl status 服務名 顯示狀態 systemctl restart 服務名 重啟服務 systemctl enable 服務名 開機啟動服務 systemctl disable 服務名 禁止開機啟動 systemctl list-units 查看系統中所有正在運行的服務 systemctl list-unit-files 查看系統中所有服務的開機啟動狀態 systemctl list-dependencies 服務名 查看系統中服務的依賴關系 systemctl mask 服務名 凍結服務 systemctl unmask 服務名 解凍服務 systemctl set-default multi-user.target 開機時不啟動圖形界面 systemctl set-default graphical.target 開機時啟動圖形界面
# 顯示某個 Unit 是否正在運行 $ systemctl is-active application.service # 顯示某個 Unit 是否處於啟動失敗狀態 $ systemctl is-failed application.service # 顯示某個 Unit 服務是否建立了啟動鏈接 $ systemctl is-enabled application.service
# 查看每個服務的啟動耗時
$ systemd-analyze blame
# 查看當前運行的所有服務
$ systemctl list-units
# 查看服務是否開機啟動
$ systemctl list-unit-files
這個列表顯示每個配置文件的狀態,一共有四種。
- enabled:已建立啟動鏈接;表示允許開機啟動
- disabled:沒建立啟動鏈接;表示禁止開機啟動
- static:該配置文件沒有
[Install]
部分(無法執行),只能作為其他配置文件的依賴- masked:該配置文件被禁止建立啟動鏈接
# 顯示sshd服務的狀態
$ systemctl status sshd
Loaded
行:配置文件的位置,是否設為開機啟動Active
行:表示正在運行Main PID
行:主進程IDStatus
行:由應用本身(這里是 httpd )提供的軟件當前狀態CGroup
塊:應用的所有子進程- 日志塊:應用的日志
Active
行:
active(running) 表示程序正在執行;
atcive(exited) 執行一次就正常退出的服務,不在系統中執行任何程序;
active(waiting) 正在執行中,處於阻塞狀態,需要等待其他程序執行完才能執行;
inactive (dead) 未啟動狀態;
舉例:
[root@rhel7 home]# cd /etc/systemd/system/ [root@rhel7 system]# cat wxzc.service [Unit] Description=wxzc service After=libvirtd.service [Service] Type=forking ExecStart=sh /home/test/zcservice.sh PrivateTmp=true [Install] WantedBy=multi-user.target
參考:
https://blog.csdn.net/liuchonghua/article/details/81743606
https://www.cnblogs.com/zwcry/p/9602756.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html