我的虚拟机运行在 ubuntu(14.04.4) 上。有时,我只想通过reboot命令重新启动虚拟机。当我执行命令时,提示“成功”,但什么也没发生。
我检查了系统日志,没有发现特殊日志。某些服务(如 ssh)似乎已关闭。
我的虚拟机在重新启动之前刚刚遇到 docker 挂起问题(1.12.6),我刚刚删除了 /var/lib/docker 下的 docker 文件。僵尸进程仍然存在。
可以从 VM Web 控制台重新启动该 VM。 (我没有权限)
我想知道,
- 发生这种情况我能做什么?
- 我怎样才能找到这个问题的线索,比如在/proc下找到的东西?使用“shutdown -r”重新启动,尝试杀死所有正在运行的进程,任何情况都会导致“重新启动”挂起?
- 在第一个“reboot”命令之后,我可以再次运行“reboot -f”来关闭系统吗?我没有尝试,因为它不安全。
聚苯乙烯
可以针对此问题执行魔法命令,服务器立即成功重启,
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
我知道重新启动可能会优雅地重新启动,例如将脏页同步到磁盘,杀死所有正在运行的进程等等。
当我运行重新启动时,在特殊命名空间中生成了一些僵尸进程。由于 docker 容器被删除,命名空间也被删除,内存中只剩下 task_struct 需要 wait4 释放
进程之间的继承是,
容器取出后的处理,
- docker 容器可以被杀死,然后子进程被 init 1 收养
- 由于容器被删除,入口点启动进程无法被终止
僵尸一直存在,因为父进程被留在内存中而没有 wait4
- init 1(全局 ns) -> docker 容器化(全局 ns)(睡眠) -> docker 入口点启动(容器 ns)(睡眠) -> java(容器 ns)(僵尸)