参考文章:
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安装
以下四种安装方式请根据自己的需求选择
-
配置好yum源后,可以直接安装
yum install supervisor
-
Debian/Ubuntu可通过apt安装
apt-get install supervisor
-
pip安装
pip install supervisor
-
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 ;启动所有应用
遇到的问题
- 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后,该问题就解决了
- 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中定义的)