systemctl啟動


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

https://www.cnblogs.com/architectforest/p/12678245.html

http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html


免責聲明!

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



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