systemd關機流程 以及 自定義systemd關機腳本和服務

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章