c++ createtoolhelp32snapshot取进程路径_Supervisord管理进程实践
今天凑空研究了下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进程
1 |
|
关闭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-supervisord