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

linux中后台进程管理利器supervisord

phpmianshi4周前 (11-04)运维32

背景

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

 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'


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

相关文章

linux中nf_conntrack table full dropping packet问题处理

概述:在日常的服务器运维过程中,发现某段时间 /var/log/messages日志报错nf_conntrack:table full,drop packet简介:nf_connt...

快速删除复制代码中的行号

有时我们copy的代码中前面有行号,一个一个删除太麻烦可以用下面三种方式删除行号:1.awk操作 awk '{for(i=2;i<=NF;i++)printf(&qu...

linux中如何排查负载过高的问题

概况Linux的负载高,主要是由于CPU使用、内存使用、IO消耗三部分构成。任意一项使用过多,都将导致服务器负载的急剧攀升。如何判断系统是否已经Over Loadw、uptime、top 等命令都可以...

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

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

进程、线程和协程三者之间的区别和联系

一、进程、线程、协程1,进程    进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,...

linux中配置内核参数sysctl详解

概念sysctl用于运行时配置内核参数,这些参数位于/proc/sys目录下。sysctl配置与显示在/proc/sys目录中的内核参数。用户只需要编辑/etc/sysctl.conf文件,即可手工或...

发表评论

访客

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