问题
生产环境使用了 horizon 来处理队列数据,但是在 supervisor 自动重启的过程中,发现有时候会有一些消费者进程在部署的时候无法正常被 kill 掉,导致一些旧的代码消费队列数据,从而引起报错。
原因是可能在重启的时候,那个消费者恰好在处理长时间的任务,导致无法被 kill 掉。但无法肯定是这个原因。
解决方法
每分钟 kill 掉那些不是当前 horizon 子孙进程的消费者(S 状态才会 kill 掉,保证正常业务不受影响)。
解决思路
- 通过
shell_exec
来执行ps
、pstree
等命令查看当前的进程信息,从而找出那些异常的消费者进程 id。 - 判断这些异常进程是否没有在处理任务。
- kill 掉 S 状态的异常消费者进程。
注意:
shell_exec
里面使用ps aux
可能无法获取正常在终端运行的结果,需要使用ps -efww
才可以获取完整的输出。
实现代码
1 |
|