Supervisor实现进程守护

14 篇文章 0 订阅
13 篇文章 0 订阅

参考文章:
https://www.jianshu.com/p/39b476e808d8
https://www.jianshu.com/p/0b9054b33db3

本文系统环境:centos7
PHP框架:Yii2

一、supervisor简介

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

二、supervisor安装

以下四种安装方式请根据自己的需求选择

  1. 配置好yum源后,可以直接安装

    yum install supervisor
    
  2. Debian/Ubuntu可通过apt安装

    apt-get install supervisor
    
  3. pip安装

    pip install supervisor
    
  4. easy_install安装

    easy_install supervisor
    

三、supervisor使用

安装成功后查看安装的位置,/etc/supervisor/

root@48462e388cfb:/# whereis supervisor
supervisor: /etc/supervisor /usr/share/man/man1/supervisor.1.gz

这时可以查看它的默认主配置文件

root@48462e388cfb:/# vim /etc/supervisor/supervisord.conf

在这里插入图片描述
最下面的文件夹 /etc/supervisor/conf.d是我们自定义配置的地方。

如下sxdTest.conf是我自己放进去的配置文件,就是需要守护的进程

root@48462e388cfb:/# cd /etc/supervisor/conf.d/
root@48462e388cfb:/etc/supervisor/conf.d# ls
sxdTest.conf

看一下sxdTest.conf的配置

[program:php-sxdTest]
priority=5
autostart=true
autorestart=true
startsecs=6
user=root
directory=/workspace/mysite-yii/
command = /workspace/mysite-yii/yii sxd-test/index
stdout_logfile=/var/log/supervisor/sxdTest.log

说明:这里的command是以yii2为例,刚开始使用的是 /yii sxd-test/index,但是一直报出/yii 命令找不到,于是改成了绝对路径 /workspace/mysite-yii/yii sxd-test/index

启动supervisor

supervisord -c /etc/supervisor/supervisord.conf

这时查看进程

ps -ef 

可以看到我的脚本已经正常启动了
在这里插入图片描述此时,杀掉该进程

kill -9 20613

再次查看进程,可以看到,supervisor已经自动将sxd-test这个进程再次拉起了

ps -ef

在这里插入图片描述
再看supervisor.log的日志,可以看到重启进程的日志

tail -200 -f /var/log/supervisord.log

在这里插入图片描述至此,已经达到了使用supervisor来进行守护进程的目的

设置开机重启

常用命令
启动supervisor supervisord -c /etc/supervisor/supervisord.conf
重启 supervisorctl reload (修改配置文件后可用“supervisorctl reload”命令来使其生效)

supervisorctl restart ;重启指定应用
supervisorctl stop ;停止指定应用
supervisorctl start ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用

遇到的问题

  1. exit status 127
/var/log/supervisor/supervisord.log中的日志
exited: php-sxdTest (exit status 127; not expected)

配置文件中的command参数不正确,我把命令 ./workspace/mysite-yii/yii sxd-test/index 改成 /workspace/mysite-yii/yii sxd-test/index后,该问题就解决了

  1. exit status 0
/var/log/supervisor/supervisord.log
exited: php-sxdTest (exit status 0; not expected)

这个问题的原因是因为我的脚本不是一个循环,所以在执行了一次后正常结束了进程,并在/var/log/supervisor/supervisord.log中输出了该信息,程序是正常结束的,也算不上bug,因此当我把脚本改成while循环后,该问题解决,脚本如下

use yii\console\Controller;

class SxdTestController extends Controller
{
    public function actionIndex()
    {
        $i = 1;
        while ($i <= 1000) {
            echo "结果:{$i}" . PHP_EOL;
            sleep(1);
            $i++;
        }
    }

}

总结一下

supervisor的默认主配置文件/etc/supervisor/supervisord.conf
自定义的配置文件 /etc/supervisor/conf.d/sxdTest.conf(在supervisord.conf中定义的)
supervisor的系统日志路径 /var/log/supervisor/supervisord.log
我的脚本sxd-test/index的执行日志路径 /var/log/supervisor/sxdTest.log(在sxdTest.conf中定义的)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值