自己做的系统碰到了一个问题,我的系统上面运行着monit和heartbeat,monit监控heartbeat的状态,当heartbeat进程出现问题的时候,monit会重新拉起heartbeat。这本来是一个perfect的功能,但是当重启时,heartbeat早于monit关闭,此时heartbeat又被拉起,导致heartbeat双方通信出现问题。下面分析下系统关机的过程,并验证下解决问题的推断。
- 验证用户身份
只有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. 完成关机。
阅读(6414) | 评论(0) | 转发(0) |