今天发现. 在 centos 7.4下布的一个docker ce-17.09.0 里的应有有问题. 远程用 ssh连接后reboot物理机时不能正常完成关机过程.
系统使用 /etc/rc.local启动 docker相关服务及container. 启动,服务过程都是正常的.
后来经过确认 debian 8 , debian 9 上用 rc-local服务启动的 docker container也存在同样的问题.
出了问题就得分析一下,找出解办法.
--------
收集信息的过程十分复杂. 这个重启故障不一定100%出现. 这也使整个收集过程变得异常复杂.
reboot之后 整个系统会卡在 停止 rc.local上.
远程通过网络看这个IP是可以ping通的. 远程的 ssh(tcp 22) 端口处于关闭状态.应该是opensshd已经停止运行了.
但内核还在.卡在关机的什么位置.
有时卡住,前台连接上键盘按几下会出这个提示. 但有时前台怎么按也不出.
A stop job is running for /etc/rc.d/rc.local Compatibillity (已经用时间/ no limit)
这个卡住的计时会在你按 ctrl+alt+del后重新计时(有显示时). 但只按一下是重启不了的.
如果你连续快按几次 ctrl+alt+del 系统就被重启了.
问题不是一定出现.有些情况不会出.这里列出一些.
如果远程ssh不登录 and 前台console不登录. 就不会卡在那儿. 启完之后前台直接按 ctrl+alt+del 正常重启了.
前台 console root 登录 . 再按 ctrl+alt+del 卡住 无法完成重重启动.
前台 console root 登录 . 再执行 reboot 正常重启了.
远程ssh登录 前台按 ctrl+alt+del 正常重启了.
远程ssh登录 执行reboot 卡住 无法完成重重启动.
--------
最后确定. 应该是 systemd在停止 rc-local.service时. 会一直卡住. 所以出现的这个问题.
那么就要找出解办法.
关于为什么会一直卡住. 发现的线索.
由rc.local 启动的 docker-containerd-shim 进程有些情况下. 接到 kill命令直接发的信号不会退出. kill -9 才会退出.
用ssh或是console登录的 docker-containerd-shim 进程 接到 kill命令发的信号就会退出.
这是正常启动后的服务状态.
rc-local.service loaded active running /etc/rc.d/rc.local Compatibility
ssh连接到服务器执行 systemctl stop rc-local 会显示成这样.
rc-local.service loaded deactivating stop-sigterm start /etc/rc.d/rc.local Compatibility
卡在这种状态下 docker-containerd-shim 进程坚持着,不退出.
如果我执行 kill -9 把进程杀掉后. 服务才正常结束掉.
如果ssh连接到服务器 能正常执行 systemctl stop rc-local 完成. 那重启也不会卡住. 如果执行这个命令就卡住那reboot时也不能完成关机.
-----------------
找到的一个解决办法.
在 rc-local.service 的[Service] 段中加
TimeoutStopSec=5
默认这一项的值是 0 .
设置时非零值. systemd在关于这个服务时 会在超过 TimeoutStopSec 的时间后发 信号9 给剩下的进程. 不会一直等着. 这样就算能解决这个问题了.
----------
可是. 为什么有些情况那些进程就kill不掉.有时可以顺利被杀掉. 我还是不知道原因.
就这一个问题被折磨傻掉了. 我安装的测试系统改一下配置,再改回默认后, 就完全正常了. 之后故障现像都重现不了. 一个小午加上一晚上. 系统重装再布应用整了好几遍.
在没有 systemd之前.linux的系统不会是这样的. 这种神奇不一定会出现的故障我就没怎么见过. 真是痛苦.
记下来. 为了花掉的 中午, 下午 和 晚上 的时间.