[Linux系统] 使用supervisor管理进程

一、安装supervisor

由于supervisor暂不支持python3,所以我们使用python2的easy_install安装:

[r ~]# python -V
Python 2.7.5
[ ~]# easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple supervisor
Searching for supervisor
Reading https://pypi.tuna.tsinghua.edu.cn/simple/supervisor/
Best match: supervisor 4.1.0
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/de/87/ee1ad8fa533a4b5f2c7623f4a2b585d3c1947af7bed8e65bc7772274320e/supervisor-4.1.0.tar.gz#sha256=2dc86fe0476e945e61483d614ceb2cf4f93b95282eb243bdf792621994360383
Processing supervisor-4.1.0.tar.gz
Writing /tmp/easy_install-tUwPwD/supervisor-4.1.0/setup.cfg
Running supervisor-4.1.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-tUwPwD/supervisor-4.1.0/egg-dist-tmp-92tQX5
warning: no previously-included files matching ‘*‘ found under directory ‘docs/.build‘
Adding supervisor 4.1.0 to easy-install.pth file
Installing echo_supervisord_conf script to /usr/bin
Installing pidproxy script to /usr/bin
Installing supervisorctl script to /usr/bin
Installing supervisord script to /usr/bin

Installed /usr/lib/python2.7/site-packages/supervisor-4.1.0-py2.7.egg
Processing dependencies for supervisor
Finished processing dependencies for supervisor

二、配置supervisor

1.生成supervisord.conf

[ ~]# echo_supervisord_conf > /etc/supervisord.conf
[ etc]# ll /etc/super*
-rw-r--r--. 1 root root 10535 Jan 31 03:45 /etc/supervisord.conf

2.修改配置文件之前准备工作

查看uwsgi的绝对路径:

# 进入虚拟环境,查看uwsgi绝对路径
[-venv-fb ~]# workon venv_fb
(venv_fb) [-venv-fb ~]# which uwsgi
/root/.virtualenvs/venv_fb/bin/uwsgi

再找到uwsgi需要的ini配置文件的绝对路径:

/root/admin_demo/uwsgi.ini

3.修改配置文件

vi /etc/supervisord.conf

在配置文件的最后添加以下内容:

[program:admin_demo]
command=/root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini

这条命令是使用uwsgi运行django项目。

其他配置项:

[program:admin_demo]
command=/root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini

autostart = true     ; 在 supervisord 启动的时候也自动启动
autorestart = true   ; 程序异常退出后自动重启
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
startretries = 3     ; 启动失败自动重试次数,默认是 3
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
user=root                
loglevel=info

三、使用supervisor

1.启动supervisord

执行命令启动supervisord进程:

[ etc]# supervisord -c /etc/supervisord.conf
Unlinking stale socket /tmp/supervisor.sock
[-venv-fb etc]# ps -ef | grep super                 
root       4056      1  0 04:03 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root       4070   3565  0 04:03 pts/0    00:00:00 grep --color=auto super

启动program:admin_demo:

[ etc]# supervisorctl -c /etc/supervisord.conf 
admin_demo                       RUNNING   pid 4504, uptime 0:00:08

此时查看uwsgi进程:

[ supervisor]# ps -ef |grep uwsgi
root       4504   4503  0 04:48 ?        00:00:00 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4505   4504  0 04:48 ?        00:00:00 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4506   4504  0 04:48 ?        00:00:00 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4507   4504  0 04:48 ?        00:00:00 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4508   4504  0 04:48 ?        00:00:00 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4509   4504  0 04:48 ?        00:00:00 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4520   3958  0 04:52 pts/1    00:00:00 grep --color=auto uwsgi

2.停止进程

[ etc]# supervisorctl -c /etc/supervisord.conf 
admin_demo                       RUNNING   pid 4504, uptime 0:03:41
supervisor> stop admin_demo  # 或者stop all,结束所管理的所有进程
admin_demo: stopped

此时查看uwsgi进程:

[ supervisor]# ps -ef |grep uwsgi
root       4526      1 49 04:55 ?        00:00:08 /root/.virtualenvs/venv_fb/bin/uwsgi --ini /root/admin_demo/uwsgi.ini
root       4538   3958  0 04:55 pts/1    00:00:00 grep --color=auto uwsgi

我们看到,虽然我们使用了stop admin_demo,但是uwsgi遗留了两条进程,这两条进程编程了孤儿进程(父进程是init gid=1)。

????具体原因不明。。可能是因为uwsgi的实现问题。其他程序可能不存在这种问题。

相关推荐