当前位置:首页 > 运维 > 正文内容

linux中后台进程管理利器supervisord

phpmianshi6个月前 (11-04)运维273

背景

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。

supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。


当用supervisor监护进程时,被监护进程不能是守护进程,这是由于守护进程通常会在fork完子进程后就让父进程”结束生命”,也即由supervisor创建的父进程退出,此时,supervisor无法再监护已退出进程创建出来的子进程。


安装supervisor

下载并安装supervisor

https://pypi.python.org/pypi/supervisor/

找到适合自己的版本

wget -v https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz

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,但好像实际中不使用这个模块也没问题。所以解决方法有两种。

 a.可以修改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

b.安装满足要求的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

2. supervisord: Error: Cannot open an HTTP server: socket.error reported errno.ENOENT (2)

系统重启后无法启动supervisord,查看/var/log/messages得到以下错误提示:

supervisord: Error: Cannot open an HTTP server: socket.error reported errno.ENOENT (2)

原因是由于sock与pid文件默认是存放在/var/run/supervisor文件夹下,系统重启后会自动清理/var/run,需要手动再重新创建/var/run/supervisor

解决方案:

修改配置文件   vi /etc/supervisord.conf


找到所有 /var/run/supervisor/supervisor.sock  修改为 /var/run/supervisor.sock  ,一般有2个地方,仔细查查都修改了


附带安装配置脚本


注意修改下载链接:

#!/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'


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

linux下utf-8 BOM的检查和删除

背景当源程序是gbk格式,你转换为 utf8 的时候,很多情况是头部会出现bom,当是php 程序时候,这样会出现很多意想不到的事情,那怎么办呢,你可以用linux 命令来查找,然后对文件的bom 进...

linux中浅谈端口占用和开闭管理

背景平时开发或线上运维少不了跟端口打交道,今天我们简单聊聊平时跟端口相关的几个场景首先查看某台主机某个端口服务是否正常比如查看本机 redis服务是否正常telnet 127.0.0.1&n...

HTTP状态码302、303和307的前世今生

背景《HTTP权威指南》第3章在讲解30X状态码时,完全没有讲清楚为什么要有302、303、307,以及他们的关系,一句“问题出在HTTP1.1”;而第五章在讲重定向响应时,没有说到现在很常见的302...

负载均衡工作模式以及工作原理

负载均衡的多种解决方案:HTTP重定向当用户发来请求的时候,Web服务器通过修改HTTP响应头中的Location标记来返回一个新的url,然后浏览器再继续请求这个新url,实际上就是页面重定向。通过...

linux中如何查看系统io使用情况

linux中查看IO的方法主要有下面几种方法:1. top   %wa    的含义是等待输入输出的CPU时间百分比,这个数字越高说明越多的CPU资源...

linux中sed用法读这一篇就够了

1.概念sed是一种行编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。