- 简介
supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。它是通过 fork/exec 的方式把这些被管理的进程当作 supervisor 的子进程来启动,这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor 还提供了一个功能,可以为supervisord 或者每个子进程,设置一个非 root 的 user,这个 user 就可以管理它对应的进程。 - 使用
近期,由于业务需求,使用了 rabbitmq 消息队列,本地命令行测试无问题,放在服务器后台执行,隔一段时间就会挂掉,查询资料,最后选中
supervisor 管理 rabbitmq 消费队列常驻进程,可以在进程异常退出的时候自动重启。
原以为问题解决,谁知,消费消息时还是过一段时间挂掉,挂掉的时候重启 supervisor 对应的进程即可恢复,可是为什么进程停止时 supervisor 重启呢?
带着这个疑问,继续查找资料,发现
当进程意外被 kill 或出现异常时,Supervisor会自动重启该进程。
但如果 supervisor 监控的进程出现内存泄漏或连接不自动释放的情况,supervisor 并不会执行重启
原来如此…
那就需要定期重启指定的进程,可是 supervisor 不支持定期自动重启,那就定时任务吧。 - supervisor 定期重启指定进程
比如每小时重启进程 test
0 * * * * supervisorctl restart test
如果提示 supervisorctl: command not found
在根目录下使用 find -name supervisorctl 查找文件位置
我的是 /www/server/panel/pyenv/bin/supervisorctl
0 * * * * /www/server/panel/pyenv/bin/supervisorctl restart test
完美解决问题!!!