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
来源:CSDN
作者:桐哥
链接:https://blog.csdn.net/z1026544682/article/details/104538239