有关Linux关机流程的一些思考

发布时间:2020-12-23编辑:脚本学堂
问题:系统上面运行着monit和heartbeat,monit监控heartbeat的状态,当heartbeat进程出现问题的时候,monit会重新拉起heartbeat。

问题:
系统上面运行着monit和heartbeat,monit监控heartbeat的状态,当heartbeat进程出现问题的时候,monit会重新拉起heartbeat。这本来是一个perfect的功能,但是当重启时,heartbeat早于monit关闭,此时heartbeat又被拉起,导致heartbeat双方通信出现问题。下面分析下系统关机的过程,并验证下解决问题的推断。

1.验证用户身份
只有root用户才可以执行关机或者重启命令,所以关机检查当前用户是不是超级用户。
 

复制代码 代码如下:
bash-3.2$ id
uid=502(com) gid=502(com) groups=502(com),503(piduser)
bash-3.2$ /sbin/shutdown -h now
shutdown: you must be root to do that!

可以明显看到只有root用户才可以执行这条命令
2.解析命令行参数
这里我们只分析shutdown -r now 这条命令
这里的-r设置downlevel 为6
0是关机,6是重启
3. 检查关机命令是否在运行
4. 生成关机pid,在/var/run/shutdwon.pid
5. 忽略系统信号
6. 执行关机
 在/var/log/messages我们可以看到这条日志shutting down for system reboot,说明系统开始执行关机流程了。
7. 执行init
 关掉/etc/rc6.d下面以k开头的进程,然后执行kill -1 SIGTERM,最后执行kill -1 SIGILL
8. 完成关机。