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
After=getty@tty1.service 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

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页