Supervisord管理进程实践

本文来自个人博客:https://thief.one/2018/06/01/1/

首次发于:2018.06.01日

今天凑空研究了下Supervisord,这是一款linux进程管理工具,使用python开发,主要用于在后台维护进程(类似master守护进程),可以实现监控进程的状态、自动重启进程等操作,便于一些服务的维护与监控。

安装Supervisord

由于是用python开发的,因此使用pip安装最为方便。

说明:安装完成之后多了3个工具:echo_supervisord_conf、supervisorctl和supervisord。

Supervisord配置文件

首先可以使用echo_supervisord_conf命令获取supervisor配置模板:

说明:该命令在当前目录下创建了一个文件名为supervisord.conf的配置文件,编辑配置文件:

来看看默认配置文件中的主要配置项:(还有一些配置不常用,可以忽略)

运行以下命令启动supervisord进程,可测试supervisord是否安装成功并执行。

查看系统进程中是否多了一个supervisord:

配置Program

program就是用来配置监控不同的应用程序进程的,推荐每个应用程序单独写一个program配置文件,然后在supervisord.conf中通过include加载所有应用程序的配置。

这里拿创建一个celery进程为例,首先在supervisord.conf最后一行写入:

然后创建/etc/supervisor目录,并到目录下创建/etc/supervisor/celery_touchscan.conf文件,写入:

重启supervisord进程:

此时查看系统上的进程,发现创建了一个supervisord守护进程,10个celery的work进程(celery的work进程数量取决于command命令中的-c参数以及配置文件中的numprocs参数,numprocs参数是指运行几次command命令,而在celery命令行中指定了需要运行的work数量)

说明:此时如果手动kill掉celery的work进程,会发现celery的work进程会被supervisord自动重启,只有当supervisord守护进程被kill以后,才能真正kill掉celery的work进程。

supervisord命令行操作

启动supervisord进程关闭supervisord进程重启supervisord进程查看进程状态

效果如下:

每列分别代表:programe名称、进程名称,进程状态、进程id,运行时间

更多supervisorctl命令

说明:可以直接在系统shell中执行,也可以先执行supervisorctl,进入supervisorctl_shell中执行相应的命令。

针对Python环境

如果项目使用了python的pyenv模块来设置环境,则supervisord配置文件中需要指定python环境的路径。其中有两种方式指定程序使用的Python环境:

command使用绝对路径。

通过environment配置PYTHONPATH。

使用supervisord注意点

子进程问题

有时候用Supervisor托管的程序还会有子进程,如果只杀死主进程,子进程就可能变成孤儿进程。通过以下这两项配置来确保所有子进程都能正确停止:

配置更新

每次修改supervisord配置文件后,需要重启supervisord进程。

后台程序问题

Supervisor只能管理在前台运行的程序,所以如果应用程序有后台运行的选项,需要关闭。

supervisord与定时任务

supervisord主要用来管理进程,而不是调度任务,因此如果有定时任务的需求,跟结合crontab一起使用。当然如果是管理celery服务,可以结合celery自身的定时任务功能,具体可移步:https://thief.one/2017/08/25/1/

参考

https://pypi.org/project/supervisor/

https://www.jianshu.com/p/9559ab642d88

http://liyangliang.me/posts/2015/06/using-supervisor/

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180601G12TI900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券