在开发一个软件的时候,通常会用到守护进程来做一些任务。比如耗时的邮件发送、计算各种榜单的排名、MQ 队列的消费。通常,我们可以 nohup 运行脚本,并通过 crontab 来监测脚本运行情况。但 Supervisor 的出现使这一切变得更加的简单。它可以带来更多的好处:
- 通过简单配置,即可创建守护进程。
- 对进程分组的控制。比如需要 10 个相同的进程处理邮件发送。
- 简单、易用的命令。
安装
通过系统的包进行安装:
sudo apt-get install supervisor
Supervisor 是 CS 架构。安装完成后,通过 ps -ef ,你将看到已经运行的 supervisord 服务:
/usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
在 UNIX 系统上,我们可以通过客户端(supervisorctl)发送命令让服务端创建、开启、停止进程。
/etc/supervisor/supervisord.conf 为 supervisor 的默认配置文件。
[supervisord]
; 服务的日志文件路径,记录服务的运行日志
logfile=/var/log/supervisor/supervisord.log
; supervisord 存放 pid 的文件
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor
[include]
; 导入进程的配置文件
files = /etc/supervisor/conf.d/*.conf
进程的配置文件可以放在上面的配置中,但是建议单独存放,如上配置则放在 /etc/supervisor/conf.d/ 目录下,以 .conf 作为扩展名,例如,foo.conf 定义了一个 foo 的进程:
; 定义的进程命令名称
[program:foo]
; 进程具体需要执行的命令,这里建议为绝对路径
command=/bin/foo
; 默认启动的进程数
numprocs=1
; 命令启动后,进程的名称。
; 如果要启动多个进程,这里要改为 %(program_name)s_%(process_num)02d
process_name=%(program_name)s
; 进程异常错误时的日志地址
redirect_stderr=/tmp/supervisor/foo.log
使用
添加你所需要的命令后,重新导入配置文件,并开启进程。
supervisorctl reload
supervisorctl restart all
通过 supervisorctl 命令对进程进行管理。
命令 | 说明 |
---|---|
supervisorctl start foo |
启动进程 foo |
supervisorctl start all |
启动所有定义的进程 |
supervisorctl start foo:* |
启动 foo 进程组。foo 的进程数量大于1 |
supervisorctl stop foo |
停止进程 foo |
supervisorctl status |
查看定义进程状态 |
注意事项
- supervisor 不能优雅的重启进程(关闭时,不会等待当前任务处理完成),关闭时可能你的任务只执行完一部分。
- 定义进程被 kill 后,supervisor 会自动重新创建。但进程运行异常,则进程的 status 提示:
Exited too quickly (process log may have details)
- 服务器重启时建议自动开启 supervisor 服务。通过在 /etc/rc.local 文件中添加 supervisord 启动的配置。
/usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf