天天看点

Supervisor 定期重启指定进程

  1. 简介

    supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。它是通过 fork/exec 的方式把这些被管理的进程当作 supervisor 的子进程来启动,这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor 还提供了一个功能,可以为supervisord 或者每个子进程,设置一个非 root 的 user,这个 user 就可以管理它对应的进程。

  2. 使用

    近期,由于业务需求,使用了 rabbitmq 消息队列,本地命令行测试无问题,放在服务器后台执行,隔一段时间就会挂掉,查询资料,最后选中

    supervisor 管理 rabbitmq 消费队列常驻进程,可以在进程异常退出的时候自动重启。

    原以为问题解决,谁知,消费消息时还是过一段时间挂掉,挂掉的时候重启 supervisor 对应的进程即可恢复,可是为什么进程停止时 supervisor 重启呢?

    带着这个疑问,继续查找资料,发现

    当进程意外被 kill 或出现异常时,Supervisor会自动重启该进程。

    但如果 supervisor 监控的进程出现内存泄漏或连接不自动释放的情况,supervisor 并不会执行重启

    原来如此…

    那就需要定期重启指定的进程,可是 supervisor 不支持定期自动重启,那就定时任务吧。

  3. 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
           

完美解决问题!!!