centos7 rc.local运行 docker 不能正常reboot的处理.

今天发现. 在 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的系统不会是这样的.  这种神奇不一定会出现的故障我就没怎么见过. 真是痛苦.

   

记下来. 为了花掉的  中午, 下午 和 晚上 的时间.

你可能感兴趣的:(迷糊地,干体力活)