Supervisor是用Python开发的一套通用的进程管理程序,
能将一个普通的命令行进程变为后台daemon,并监控进程状态,
异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,
这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。
当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。
supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
安装supervisor
这里讲的是在centos环境下的
yum install epel-release
yum install -y supervisor
yum安装执行上两条命令
其中可能会报错
No such file or directory: '/tmp/yum_save_tx.2019-09-11.15-00.dE0jiX.yumtx'
这类文件不存在的错误,解决方法是,在它指定的目录下创建它要求的文件就行咯,例如
touch /tmp/yum_save_tx.2019-09-11.15-00.dE0jiX.yumtx
然后执行以下命令
systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务
systemctl status supervisord # 查看supervisord服务状态
ps -ef|grep supervisord # 查看是否存在supervisord进程
到这里,supervisor就差不多安装好了
接下来就要给它事情做了
打开supervisor的配置文件
vim /etc/supervisord.conf
然后加入要托管的任务,我把我的uwsgi任务和celery任务给到它
这样写
[program:uwsgi]
command=uwsgi --ini /opt/script/uwsgi.ini
autostart=true
autorestart=true
user=root
startretries=5
startsecs=10
stdout_logfile=/opt/logs/uwsgi_supervisor.log
[program:celery]
directory=/opt/blog_run
command=python3 manage.py celery worker -A blog_run -l info
autostart=true
autorestart=true
user=root
startretries=5
startsecs=10
stdout_logfile=/opt/logs/celery_supervisor.log
然后输入wq保存并退出
下面要将更新supervisor的状态了,将我们新增的任务同步进去
supervisorctl status #查看所有任务的状态
supervisorctl status 服务名 #查看单个任务的状态
supervisorctl start 服务名 #启动单个任务
supervisorctl stop 服务名 #停止单个任务
supervisorctl restart 服务名 #重启单个任务
supervisorctl update #将新增的任务刷新出来
supervisorctl #进入supervisor的交互环境,在里面可以进行start 服务名 等对任务进行的操作,这里就不多说了
如果在update新的任务报错
类似我上方图片这类错误的时候,你就需要看看你托管的进程中,是否开启了daemonize守护线程
我图中的redis就是因为开启了daemonize yes ,所以无法托管
原因见文章开始的那几句话