背景
Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。
supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
当用supervisor监护进程时,被监护进程不能是守护进程,这是由于守护进程通常会在fork完子进程后就让父进程”结束生命”,也即由supervisor创建的父进程退出,此时,supervisor无法再监护已退出进程创建出来的子进程。
安装supervisor
下载并安装supervisor
https://pypi.python.org/pypi/supervisor/
找到适合自己的版本
tar -zxvf supervisor-3.3.4.tar.gz
cd supervisor-3.3.4
python setup.py install
安装完毕!
官网安装参考:http://supervisord.org/installing.html
测试是否安装成功:
echo_supervisord_conf
会显示一个配置模板
创建配置文件:
echo_supervisord_conf > /etc/supervisord.conf
修改/etc/supervisord.conf
最后新增(新增前先检查下是否存在):
[include] files = /etc/supervisord.d/*.ini
mkdir -p /etc/supervisord.d/
每个进程的配置文件都可以单独分拆,放在 /etc/supervisord.d/ 目录下,以.ini 作为扩展名,如果修改了 /etc/supervisord.conf ,需要执行 supervisorctl reload (重启)来重新加载配置文件,否则会感觉没有生效
先弄懂两个命令:
supervisord : supervisor的服务器端部分,启动supervisor就是运行这个命令
supervisorctl:启动supervisor的命令行窗口。
启动
supervisord (以daemon方式启动)
或 supervisord -c /etc/supervisord.conf (非daemon)
不带参数运行supervisord是以daemon方式运行
当supervisord以非daemon方式运行时,杀掉supervisord后,被监控的进程也退出了。
而以daemon方式运行,杀掉supervisord对被监控进程无影响
我的项目Laravel horizon进程管理
[program:horizon] process_name=%(program_name)s command=/home/work/php/bin/php /home/work/ico/artisan horizon autostart=true autorestart=true user=work redirect_stderr=true stdout_logfile=/home/work/logs/horizon.log
supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值
supervisorctl start programxxx,启动某个进程
supervisorctl restart programxxx,重启某个进程
supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl reload,载入最新的配置文件,并按新的配置启动、管理所有进程。
supervisorctl reread,当一个服务由自动启动修改为手动启动时执行一下就ok
如果要在命令行中使用变量,就需要自己先编写一个shell脚本。
最后添加开启启动:centos 7
NGINX 监控
supervisor 监控nginx ,写好配置文件之后,发现一直在重启,排查之后发现是命令不对:
command = /usr/local/bin/nginx 这个命令默认是后台启动,但是supervisor不能监控后台程序,所以supervisor就一直执行这个命令。
加上-g 'daemon off;'这个参数可解决这问题,这个参数的意思是在前台运行。
command = /usr/local/bin/nginx -g 'daemon off;'
[program:nginx]
command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -g 'daemon off;'
autostart=true
autorestart=true
user=root
numprocs=1
stdout_logfile=/var/log/supervisor-nginx.log
[program:php-fpm]
command=/usr/bin/php-fpm --nodaemonize
autostart=true
autorestart=true
user=root
numprocs=1
stdout_logfile=/var/log/supervisor-php-fpm.log
执行:
chmod +x /etc/rc.d/rc.local
编辑:/etc/rc.d/rc.local
最后新增:
/usr/bin/supervisord
保存
常见问题
1.使用echo_supervisord_conf生成配置文件时报错meld3 >= 0.6.5
Traceback (most recent call last):
File "/usr/bin/echo_supervisord_conf", line 5, in <module>
from pkg_resources import load_entry_point File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 2603, in <module>
File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 666, in require File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 565, in resolve
pkg_resources.DistributionNotFound: meld3>=0.6.5
这个问题是meld3这个模块的问题,按提示是要求这个模块版本号大于0.6.5,但好像实际中不使用这个模块也没问题。所以解决方法有两种。
1.可以修改requires.txt文件,注释掉这个meld3的版本要求,修改如下:
#找到requires.txt文件
locate requires.txt
#修改此文件
/usr/lib/python2.6/site-packages/supervisor-3.3.0-py2.6.egg/EGG-INFO/requires.txt,将meld3 >= 0.6.5本行注释掉.
#meld3 >= 0.6.5
#有时locate 并不能正确找到文件,我们可以尝试进入目录寻找并修改
cd /usr/lib/python2.6/site-packages && find ./ -name requires.txt
2.安装满足要求的meld版本,我想试试安装meld3来看是不是能解决,毕竟其要示离meld这个模块,Meld到底是个什么东西呢,meld主要是一个可视化的比较和合并的工具,目标人群是开发者(当然,我们将要讲到的其它部分也会考虑到最终用户)。这个工具同时支持双向和三向的比较,不仅仅是比较文件,还可以比较目录,以及版本控制的项目。Meld可以帮你回顾代码改动,理解补丁,”其官网如是说。“它甚至可以告知你如果你不进行合并将会发生什么事情。该工具使用 GPL v2 协议进行授权。
下面是我自己尝试并且成功的方法,即安装meld. meld的官网地址:https://pypi.python.org/pypi/meld3/ ,相关命令如下:
#下载meld
sudo wget https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz#md5=3ccc78cd79cffd63a751ad7684c02c91sudo tar zxvf meld3-1.0.2.tar.gz
cd meld3-1.0.2
sudo python setup.py install
sudo ldconfig
#再次执行生成配置文件成功:
sudo /usr/bin/echo_supervisord_conf
附带安装配置脚本
注意修改下载链接:
#!/bin/bash
url='https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz'
conf_dir='/etc/supervisord.d'
echo 'conf_dir start'
mkdir -p $conf_dir
echo 'conf_dir created'
cd ~
echo 'wget start'
wget -c $url > /dev/null
echo 'wget finished'
echo 'tar start'
tar -zxvf supervisor-3.3.4.tar.gz > /dev/null
echo 'tar finished'
echo 'setup start'
cd supervisor-3.3.4 && python setup.py install
echo 'setup finished'
echo 'conf start'
echo_supervisord_conf > /etc/supervisord.conf
echo '[include]' >> /etc/supervisord.conf
echo 'files = /etc/supervisord.d/*.ini' >> /etc/supervisord.conf
echo '[program:nginx]' >> /etc/supervisord.d/nginx.ini
echo "command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -g 'daemon off;'" >> /etc/supervisord.d/nginx.ini
echo "autostart=true" >> /etc/supervisord.d/nginx.ini
echo "autorestart=true" >> /etc/supervisord.d/nginx.ini
echo "user=root" >> /etc/supervisord.d/nginx.ini
echo "numprocs=1" >> /etc/supervisord.d/nginx.ini
echo "stdout_logfile=/var/log/supervisor-nginx.log" >> /etc/supervisord.d/nginx.ini
echo '[program:php-fpm]' >> /etc/supervisord.d/php-fpm.ini
echo "command=/usr/bin/php-fpm --nodaemonize" >> /etc/supervisord.d/php-fpm.ini
echo "autostart=true" >> /etc/supervisord.d/php-fpm.ini
echo "autorestart=true" >> /etc/supervisord.d/php-fpm.ini
echo "user=root" >> /etc/supervisord.d/php-fpm.ini
echo "numprocs=1" >> /etc/supervisord.d/php-fpm.ini
echo "stdout_logfile=/var/log/supervisor-php-fpm.log" >> /etc/supervisord.d/php-fpm.ini
echo "/usr/bin/supervisord" >> /etc/rc.d/rc.local
echo 'conf end'
标签:supervisor,supervisord,conf,etc,利器,nginx,linux,php From: https://blog.51cto.com/u_6353447/5981176