systemd關機流程
在使用systemd的linux系統中,reboot,shutdown,halt等命令是指向systemctl的軟鏈接,執行reboot相當於執行 systemctl reboot,systemctl reboot 會切換到 reboot.target.
下面使用systemd進行系統關閉/重啓的依賴關係圖:
(conflicts with (conflicts with
all system all file system
services) mounts, swaps,
| cryptsetup
| devices, ...)
| |
v v
shutdown.target umount.target
| |
\_______ ______/
\ /
v
(various low-level
services)
|
v
final.target
|
_____________________________________/ \_________________________________
/ | | \
| | | |
v v v v
systemd-reboot.service systemd-poweroff.service systemd-halt.service systemd-kexec.service
| | | |
v v v v
reboot.target poweroff.target halt.target kexec.target
conflicts with all system services:指那些定義了Conflicts=shutdown.target 和 Before=shutdown.target 依賴關係(除非明確設置了 DefaultDependencies=no
,否則 service 單元將會自動添加這些依賴)的服務,這些服務在shutdown.target運行之前會停止。
實際執行過程從上到下,以reboot爲例:
1.停止和shutdown.target、umount.target衝突的服務。
2.shutdown.target、umount.target
3.various low-level services
4.final.target
5.systemd-reboot.service
該服務執行的命令行:ExecStart=/bin/systemctl --force reboot,這條命令會調用systemd-shutdown,它將以簡單而強大的方式卸載任何剩餘的文件系統,殺死任何剩餘的進程並釋放任何其他剩餘的資源,而不再考慮任何服務或單元概念。一般這是最後執行的服務。
6.reboot.target
目標單元的功能僅僅是通過依賴關係將一組單元匯聚在一起, 形成一個同步點,並給這個同步點取一個衆所周知的名稱, 以便用作啓動目標或其他單元的依賴。對於shutdown.target、umount.target、final.target、reboot.target這些目標單元,其組內的單元(.wants/、.requires/)實際的啓動順序取決於單元自身的依賴關係。
自定義關機腳本
自定義關機腳本只需新建一個服務,指定服務的ExecStart爲該腳本,通過wantedby或手動建立鏈接的方式指定reboot.target、poweroff.target、halt.target等目標單元爲服務的同步點,根據實際需求指定服務的依賴關係即可。
例子:vi /lib/systemd/system/cust_shut.service
[Unit]
Description=poweroff cust
[email protected] display-manager.service plymouth-start.service
Before=systemd-poweroff.service systemd-reboot.service systemd-halt.service
DefaultDependencies=no
[Service]
ExecStart=/usr/bin/shutdown_cust.sh
Type=forking
[Install]
WantedBy=poweroff.target
WantedBy=reboot.target
WantedBy=halt.target
軟連接
ln -s /lib/systemd/system/cust_shut.service /usr/lib/systemd/system/halt.target.wants/
ln -s /lib/systemd/system/cust_shut.service /usr/lib/systemd/system/poweroff.target.wants/
ln -s /lib/systemd/system/cust_shut.service /usr/lib/systemd/system/reboot.target.wants/
參考:
https://www.freedesktop.org/software/systemd/man/bootup.html#System%20Manager%20Shutdown