systemctl啟動
1. systemd的配置文件目錄
服務啟動的配置文件主要放在 /usr/lib/systemd/system 目錄,也可能在 /etc/systemd/system 目錄
/usr/lib/systemd/system/:每個服務最主要的啟動腳本的配置放在這,有點類似以前的/etc/init.d;
/run/systemd/system/:系統執行過程中所產生的服務腳本所在目錄,這些腳本的優先級要比/usr/lib/systemd/system/高;
/etc/systemd/system/:管理員根據主機系統的需求所創建的執行腳本所在目錄,執行優先級比/run/systemd/system/高;
2. 服務啟動分析
(1.) 列出各項啟動占用的時間,並行啟動,啟動時間不決定啟動完成先后
systemd-analyze blame
結果:
700ms postgresql-11.service
1.308s zookeeper.service
30ms consul.service
53ms keepalived.service
36ms inte.service
368ms supervisord.service
(2.) 列出啟動順序矢量圖
systemd-analyze plot > boot.svg
(3.)查詢服務啟動依賴
systemd啟動順序約定為,當前服務滿足啟動條件,則立即創建進程進行並行啟動。啟動條件指服務的依賴關系(Requires、Wants)及順序關鍵字(After、Before)等
systemctl list-dependencies xxx.service
結果:
systemctl list-dependencies inte.service
inte.service
● ├─postgresql-11.service
● ├─supervisord.service
● ├─system.slice
● ├─basic.target
● │ ├─microcode.service
● │ ├─rhel-dmesg.service
(4.) 查看所有用timer啟動的服務
[root@kfk1 system]# systemctl list-unit-files --type timer
UNIT FILE STATE
chrony-dnssrv@.timer disabled
fstrim.timer disabled
iss.timer enabled
supervisord.timer enabled
systemd-readahead-done.timer indirect
systemd-tmpfiles-clean.timer static
3. 服務配置文件
[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 重啟服務之前,需要等待的秒數
[timer] 定時執行
/usr/lib/systemd/system目錄里面,新建一個mytimer.timer文件
[Unit]
Description=Runs mytimer every hour
[Timer]
OnUnitActiveSec=1h
Unit=mytimer.service
[Install]
WantedBy=multi-user.target
Timer字段說明:
OnActiveSec:定時器生效后,多少時間開始執行任務
OnBootSec:系統啟動后,多少時間開始執行任務
OnStartupSec:Systemd 進程啟動后,多少時間開始執行任務
OnUnitActiveSec:該單元上次執行后,等多少時間再次執行
OnUnitInactiveSec: 定時器上次關閉后多少時間,再次執行
OnCalendar:基於絕對時間,而不是相對時間執行
AccuracySec:如果因為各種原因,任務必須推遲執行,推遲的最大秒數,默認是60秒
Unit:真正要執行的任務,默認是同名的帶有.service后綴的單元
Persistent:如果設置了該字段,即使定時器到時沒有啟動,也會自動執行相應的單元
WakeSystem:如果系統休眠,是否自動喚醒系統
定時器相關命令:
systemctl list-timers # 查看所有正在運行的定時器
sudo systemctl start/stop mytimer.timer # 啟動/停止定時器
systemctl status mytimer.timer # 查看定時器狀態
sudo systemctl enable/disable myscript.timer # 開機自啟、取消自啟
system 日志查看
# 查看整個日志
$ sudo journalctl
# 查看 mytimer.timer 的日志
$ sudo journalctl -u mytimer.timer
# 查看 mytimer.timer 和 mytimer.service 的日志
$ sudo journalctl -u mytimer
# 從結尾開始查看最新日志
$ sudo journalctl -f
# 從結尾開始查看 mytimer.timer 的日志
$ journalctl -f -u timer.timer
4. 常用命令
systemctl #范列出系統上面有啟動的unit
systemctl list-units --all # 列出所有unit,包括inactive狀態的
systemctl list-unit-files #列出所有已經安裝的unit有哪些
systemctl list-units --all --state=inactive # 列出所有未運行的unit,即狀態是inactive的
systemctl list-units --type=service --all #列出類型為service的所有項目,不論啟動與否
systemctl get-default #輸入目前機器默認的模式,如圖形界面模式或者文本模式
systemctl isolate multi-user.target #將目前的操作環境改為純文本模式,關掉圖形界面
systemctl isolate graphical.target #將目前的操作環境改為圖形界面
systemctlpoweroff #系統關機
systemctl reboot #重新開機
systemctl suspend #進入暫停模式
systemctl rescue #強制進入救援模式
systemctl hibernate #進入休眠模式
systemctl emergency #強制進入緊急救援模式
systemctl list-dependencies --reverse #查詢當前默認的target關聯了啥
systemctl list-dependencies graphical.target #查詢圖形界面模式的target關聯了啥
systemctl list-sockets #查看當前的socket服務
systemctl show etcd.service #查看 unit 的詳細配置情況
systemctl mask etcd.service #禁用某個服務
systemctl unmask etcd.service #解除禁用某個服務
查看服務
# 查詢服務狀態
systemctl status firewalld
# 添加或修改配置文件后,需要重新加載
systemctl daemon-reload
# 服務是否在運行
systemctl is-active firewalld
# 啟動、停止服務
systemctl start/stop firewalld
# 是否開機自啟
systemctl is-enabled firewalld
# 開機自啟、禁止
systemctl enable/disable firewalld
# 注銷和取消注銷服務
systemctl mask/unmark cups
參考鏈接
https://blog.csdn.net/xing_huo95/article/details/90246050
https://www.cnblogs.com/jhxxb/p/10654554.html
