首页 > 运维 > linux中后台进程管理利器supervisord
2020
11-04

linux中后台进程管理利器supervisord

背景

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'


本文》有 0 条评论

留下一个回复