记一次supervisor无法控制所管理进程的处理方法

今天由于代码变更,需要重启服务,服务进程使用supervisor管理, 1. 执行指令:supervisorctl restart group-xxx: 一直没返回; 2. 查看所重启服务组的进程:supervisorctl status group-xxx: 发现有一个处于 STOPPING状态,其他都是STOPED; 3. 查询进程状态:ps -ef|grep xxx, 发现进程还活着; 4. cat /proc/'进程pid' status, 发现进程状态是D,也就是等待磁盘资源(Disk),因为等待磁盘资源是处于内核态,所以supervisor发送的指令进程都无法响应,导致一直处于STOPPING状态; 5. 查了一下,网上都说需要重启机器,不至于吧,想想等待磁盘的话,我把磁盘资源给他不就可以了吗,可是到底是在等待什么磁盘呢? 6. 查看一下进程的服务日志,停留在了:begin delete GFS image: /data/image/testimg/,也就是服务要删除机器挂载的磁盘上面的图片,但是一直在这里等着,没有返回,此时基本可以断定是挂载的磁盘有问题; 7. 查看磁盘状态,是正常挂载,而且也可以查看到图片。。。 8. 在查看磁盘文件夹状态:ls -al,发现只有读权限,而代码要执行删除,没有权限,所以一直等待; 9. 修改目录权限,赋予所有权限,进程成功停止。

通过此次事故,知道了一下两个重点知识: 1、服务处理内核态时,是无法响应父进程所发的SIGTERM/SIGINT等指令,但是supervisor作为父进程,已经发出了控制信号量,所以在supervisor中看到的是一直处于stopping状态; 2、如果进程需要磁盘资源,只需要解决资源问题就可以继续往下执行,而不至于重启机器; 3、服务日志一定要记录逻辑的进入和结束点,本次排查过程,日志也起到了关键作用。