centos 6.4安装supervisor守护golang进程

最近在鼓捣golang守护进程的实现,无意发现了supervisor这个有意思的东西。supervisor是一个unix的系统进程管理软件,可以用它来管理apache、nginx等服务,若服务挂了可以让它们自动重启。当然也可以用来实现golang的守护进程,下面描述下具体实现。

安装supervisor

基于centos 6.4。

supervisor使用python编写的,可以用easy_install安装。centos上默认有python的运行环境,安装起来就非常简单了。

$ sudo yum install python-setuptools
$ sudo easy_install supervisor

如果没有看到什么报错,那么就安装成功了,可以使用echo_supervisord_conf查看配置详情,而后生成配置文件。

$ sudo echo_supervisord_conf > /etc/supervisord.conf

golang http服务

先整一个简单的golang http服务

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello world")
    })

    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

直接运行这个程序会占用住终端,下面看看如何用supervisor来跑这个程序。

supervisor配置golang

编辑/etc/supervisord.conf,在最后增加运行程序设置

[program:golang-http-server]
command=/home/golang/simple_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/simple_http_server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/simple_http_server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

几个配置说明:

  • command:表示运行的命令,填入完整的路径即可。
  • autostart:表示是否跟随supervisor一起启动。
  • autorestart:如果该程序挂了,是否重新启动。
  • stdout_logfile:终端标准输出重定向文件。
  • stderr_logfile:终端错误输出重定向文件。

其余配置说明可以查看官方文档。

启动supervisor

$ sudo /usr/bin/supervisord -c /etc/supervisord.conf

如果出现什么问题,可以查看日志进行分析,日志文件路径/tmp/supervisord.log

tips:如果修改了配置文件,可以用kill -HUP重新加载配置文件

$ cat /tmp/supervisord.pid | xargs sudo kill -HUP

查看supervisor运行状态

$ supervisorctl
golang-http-server RUNNING pid 23307, uptime 0:02:55
supervisor>

输入help可以查看帮助

supervisor> help
default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

supervisor运行原理

supervisor运行后本身是守护进程,通过自身来管理相应的子进程,通过观察相应的进程状态就很明了了。

$ ps -ef | grep supervisord
root 23306 1 0 07:30 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 23331 23222 0 07:41 pts/0 00:00:00 grep supervisord

$ ps -ef | grep simple_http_server
root 23307 23306 0 07:30 ? 00:00:00 /home/golang/simple_http_server
root 23333 23222 0 07:41 pts/0 00:00:00 grep simple_http_server

可以很直观的看出golang simple_http_server进程是supervisord的子进程。

supervisor是否靠谱

supervisor的诞生已经10年了,现在是3+版本,所以放心使用吧。

centos 7使用supervisor管理laravel队列

supervisor使用python开发的一个client/server服务,是linux/unix系统下的一个进程管理工具。它可以很方便的监听、停止、重启一个或多个进程。用supervisor管理的进程,打你个进程意外被杀死,supervisor监听到进程死后,会自动将它重新拉起,很方便的做到自动恢复的功能,不再需要自己写shell脚本控制。

安装supervisor

sudo pip install supervisor

或者

easy_install supervisor

还有其他安装方式,请参考官网

supervisor安装完成后会生成三个执行程序:

  • supervisord:守护进程服务(用于接收进程管理命令)

  • supervisorctl:客户端(用于和守护进程通信,发送管理进程的指令)

  • echo_supervisord_conf:生成初始配置文件程序

配置

运行supervisord服务的时候,需要指定supervisor配置文件,如果没有显示指定,默认在以下目录查找:

/etc/supervisord.conf
/etc/supervisor/supervisord.conf 
//默认是没有这些配置文件的

可以通过echo_supervisord_conf程序生成supervisor的初始化配置文件,如下所示:

mkdir /etc/supervisor
echo_supervisor_conf > /etc/supervisor/supervisord.conf

配置文件说明

supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。

[unix_http_server]
file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ;socket文件的mode,默认是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid

;[inet_http_server]         ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user              ;登录管理后台的用户名
;password=123               ;登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ;可以打开的进程数的最小值,默认 200

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord

; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程

;包含其它配置文件
[include]
files = relative/directory/*.ini    ;可以指定一个或多个以.ini结束的配置文件
include示例:

配置管理进程

进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中。

打开最后的include注释:

 [include]
files=/etc/supervisor/conf.d/*.conf
//新增的 Supervisor 配置文件放在 /etc/supervisor/conf.d/ 目录下,并且以 conf 结尾。

这个时候就可以启动了服务了

supervisord -c /etc/supervisor/supervisord.conf

使用supervisor 管理 laravel 队列进程

我们使用 Laravel 队列,会用到 php artisan queue:work 命令,让它监听队列,我们可以通过 nohup 方式让它在后台运行,但是进程如果意外中断是不会自动重启的,所以使用 Supervisor 来监控进程是个很好的方式。

首先在 /etc/supervisor/conf.d/ 目录下新增一个 Supervisor 的配置文件,如下:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /www/artisan queue:work --tries=3
autostart=true
autorestart=true
user=nginx
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-queue.log

这里 user 填写网站运行进程的用户,如nginx,numprocs 表示启动多少个进程来监听 Laravel 队列。

一切就绪后,我们使用如下命令就可以启动队列进程的监听了:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

这里值得注意的是,如果 Laravel 处理队列的代码更改了,需要重启 Supervisor 的队列管理才能生效。

web 管理界面

未分类

出于安全考虑,默认配置是没有开启web管理界面,需要修改supervisord.conf配置文件,打开http访权限:

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001          ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123               ; (default is no password (open server))
port:绑定访问IP和端口,这里是绑定的是本地IP和9001端口 
username:登录管理后台的用户名

Centos7安装配置Python3.6 Django virtualenv gunicorn supervisor环境

跟着网上的教程走发现行不通阿!好多都是写个大概,而且每人的环境都是有些许差异的,比如说权限问题阿,等等都会造成安装的失败

说明:本教程在你已经拥有Centos7系统,已经安装好nginx服务器,已经安装了Python3.6 Django virtualenv gunicorn supervisor的前提下进行

接下来开始了!

1、新建你的django项目,假设项目名为Hello

 django-admin.py startproject Hello

2、想好你需要的端口号,假设端口号为8001(下面的端口号均以8001来举例,你可以换成你所需要的端口号),接下来启动服务器看看能不能运行,分两种情况

2.1 如果你只是想在本地运行则

python manage.py runserver127.0.0.1:8001

2.2 如果你想要外网也可以访问则

python manage.py runserver0.0.0.0:8001

3、接下来在浏览器中输入 “服务器ip:8001” ,比如我服务器的公网IP为 192.163.189.166 则输入192.163.189.166:8001,可能会出现三种情况!

3.1 成功运行

3.2 出现 DisallowedHost at / Invalid HTTP_HOST header: ‘10.211.55.6:8001’. You may need to add u’10.211.55.6′ to ALLOWED_HOSTS. 类似错误,解决方法:
进入项目目录下的Hello目录(注意项目目录名是和该名称相同的,此Hello和manage.py同级打开setting.py将ALLOWED_HOSTS = []改为ALLOWED_HOSTS = [‘*’]

3.3 如果在确保地址输入正确,端口也正确的前提下浏览器出现了 Unable to connect 错误,那么很可能是你的Centos7没有开启8001端口号的原因,解决方法

开启端口号

firewall-cmd --zone=public --add-port=8001/tcp --permanent (--permanent意思是永久生效,重启后继续生效)

重启防火墙

firewall-cmd --reload

此时再访问浏览器,如果还是访问不了,那可能是我没遇到的情况,还请自行搜索解决哦

4、配置virtualenv gunicorn

4.1 在项目根目录下输入指令 virtualenv venv (venv可以是其他名字了)

4.2 虚拟环境生成后接着要在虚拟环境中安装django 和 gunicorn 了

pip install django
pip install gunicorn

4.3 在项目根目录下创建gunicorn.conf 用来配置gunicorn,我的配置为

workers = 4
bind = '0.0.0.0:8088'

5、配置supervisor

supervisor的配置文件一般在/etc/supervisord.conf

5.1 vim /etc/supervisord.conf

5.2 在末尾加入

[program:hello]
command=/项目路径/venv/bin/gunicorn -c /项目路径/gunicorn.conf Hello.wsgi:application
directory=/项目路径
autostart=true
autorestart=true
stdout_logfile=/项目路径/logs/gunicorn.log
stderr_logfile=/项目路径/logs/gunicorn.err  

5.3 重启 supervisor

unlink /tmp/supervisor.sock
supervisord -c /etc/supervisord.conf

6、配置nignx

6.1 打开nignx.conf

6.2 在合适地方加入

location /  {
     proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_redirect off;
     proxy_pass http://192.163.189.166:8001;   #http://外网ip:8001,如果是本机访问则
http://127.0.0.1:8001
              }

6.3 重启nginx

systemctl restart nginx

7、好啦,接下来在浏览器中输入 http://192.163.189.166:8001 应该能访问咯。

supervisor的安装配置及常用命令介绍

前言

在 web 应用部署到线上后,需要保证应用一直处于运行状态,在遇到程序异常、报错等情况,导致 web 应用终止时,需要保证程序可以立刻重启,继续提供服务。

所以,就需要一个工具,时刻监控 web 应用的运行情况,管理该进程。

Supervisor 就是解决这种需求的工具,可以保证程序崩溃后,重新把程序启动起来等功能。

简介

Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程)。

安装

  1. Ubuntu系统下:apt-get install supervisor,通过这种方式安装后,自动设置为开机启动
  2. 也可以通过 pip install supervisor 进行安装,但是需要手动启动,然后设置为开机启动(不推荐这种安装方式)

Supervisor 配置

Supervisor 是一个 C/S 模型的程序,supervisord 是 server 端,supervisorctl 是 client 端。

supervisord

下面介绍 supervisord 配置方法。supervisord 的配置文件默认位于 /etc/supervisord.conf,内容如下(;后面为注释):

; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file) UNIX socket 文件,supervisorctl 会使用
chmod=0700                       ; sockef file mode (default 0700) socket 文件的 mode,默认是 0700

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) 日志文件,默认是 $CWD/supervisord.log
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) pid 文件
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致

; 在增添需要管理的进程的配置文件时,推荐写到 `/etc/supervisor/conf.d/` 目录下,所以 `include` 项,就需要像如下配置。
; 包含其他的配置文件
[include]
files = /etc/supervisor/conf.d/*.conf ; 引入 `/etc/supervisor/conf.d/` 下的 `.conf` 文件

program 配置

program 的配置文件就写在,supervisord 配置中 include 项的路径下:/etc/supervisor/conf.d/,然后 program 的配置文件命名规则推荐:app_name.conf

[program:app] ; 程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作
autorestart=True      ; 程序异常退出后自动重启
autostart=True        ; 在 supervisord 启动的时候也自动启动
redirect_stderr=True  ; 把 stderr 重定向到 stdout,默认 false
environment=PATH="/home/app_env/bin"  ; 可以通过 environment 来添加需要的环境变量,一种常见的用法是使用指定的 virtualenv 环境
command=python server.py  ; 启动命令,与手动在命令行启动的命令是一样的
user=ubuntu           ; 用哪个用户启动
directory=/home/app/  ; 程序的启动目录

需要注意:

  • 用 supervisord 管理时,gunicorn 的 daemon 选项需要设置为 False
  • 如果启动命令需要包含workon,修改environment参数:environment=PATH=”/home/username/.virtualenvs/myproject/bin”

supervisorctl 操作

supervisorctl 是 supervisord 的命令行客户端工具,使用的配置和 supervisord 一样,这里就不再说了。下面,主要介绍 supervisorctl 操作的常用命令:

输入命令 supervisorctl 进入 supervisorctl 的 shell 交互界面(还是纯命令行)

Linux上的后台进程管理工具Supervisor

当你的系统上有许多工作进程在跑,你想要一个统一的入口来管理这些进程,包括状态检查,启动和关闭,出错时警告,及自动重启等。那你就需要一个进程管理工具来帮助你。Supervisor就是其中一个简单而又强大的工具。虽说标题写了Linux,其实它可以用在大部分Unix衍生出来的系统,比如Linux, Mac OS X, Solaris和FreeBSD。

一. Supervisor组件

Supervisor有四个组件:

1. supervisord

运行Supervisor的后台服务,它用来启动和管理那些你需要Supervisor管理的子进程,响应客户端发来的请求,重启意外退出的子进程,将子进程的stdout和stderr写入日志,响应事件等。它是Supervisor最核心的部分。

2. supervisorctl

相当于supervisord的客户端,它是一个命令行工具,用户可以通过它向supervisord服务发指令,比如查看子进程状态,启动或关闭子进程。它可以连接不同的supervisord服务,包括远程机上的服务。

3. Web服务器

这是supervisord的Web客户端,用户可以在Web页面上完成类似于supervisorctl的功能。

4. XML-RPC接口

这是留给第三方集成的接口,你的服务可以在远程调用这些XML-RPC接口来控制supervisord管理的子进程。上面的Web服务器其实也是通过这个XML-RPC接口实现的。

二. 安装

Supervisor是由Python写的,源码托管在Github仓库里。如果你机上有Python环境,你可以clone一份源码,然后通过setup.py来安装:

$ python setup.py install

也可以通过PyPI安装,这样方便许多:

$ pip install supervisor

另外,Supervisor在Ubuntu和CentOS上都有分发包,比如在Ubuntu上,你就可以用”apt-get”来安装:

$ apt-get install supervisor

注意,根据你系统权限的情况,以上这些命令可能会需要root权限来执行。

三. 配置

安装完毕后,你可以执行下命令”echo_supervisord_conf”,它会将一个配置样例打印在控制台上,如果你看到配置信息了,说明安装成功。现在让我们将配置样例保存在本地:

$ echo_supervisord_conf > supervisord.conf

官网上建议直接保存在”/etc/supervisord.conf”文件中,可是大部分情况下我们是没有权限写etc目录的,所以要先保存下来,再通过root拷贝过去。Supervisor启动时会自动加载该配置文件。

让我们打开配置文件看看,这就是一个INI格式的配置文件啊,参数好多,而且大部分都注视掉了。这里就不一一介绍了,官方文档里有详细的。我们就介绍下最重要的部分,就是”[program:theprogramname]”。

这个”[program:xxx]”块定义了你要Supervisor管理的子进程,冒号后面是你可以起的名字。建议采用比较有意义的名字,因为”[program:xxx]”块可以有多个,这样可以同时管理多个不同的子进程,名字起的好方便区分。让我们了解下这个配置块下几个主要的配置参数吧:

  • command
    子进程的运行命令,比如你要监控一个Python程序”app.py”的运行,你可以设置”command=python /home/bjhee/myapp/app.py”。当supervisord服务启动时,该程序也会被自动启动,并作为子进程由supervisord管理。

  • numprocs
    同时启动的进程个数,用来实现并发,默认是1。注意如果该参数大于1的话,你必须同时配置”process_name”参数,并且将”%(process_num)s”变量放入”process_name”中,防止多个进程同名导致启动出错。

  • directory
    如果配置了这个目录,那子进程运行前,会先切换到这个目录。

  • user
    运行该子进程的用户,默认同supervisord服务的启动用户。如果supervisord由root启动,而你又不想给子进程root,你可以配置这个参数。

  • priority
    该子进程优先级,决定了启动和关闭子进程的顺序,默认是最大值999。

  • autostart
    启动supervisord时,子进程是否自动启动,默认是true。

  • autorestart
    当子进程出错退出时,supervisord是否自动将其重启,默认是unexpected,也就是不自动重启,你可以设为true。

  • stdout-logfile
    由于子进程由supervisord启动,所以其stdout将无法输出到系统的标准输出上,所以你要将子进程的stdout写入到日志文件中。这个参数指定了该日志文件的位置。

  • stderr-logfile
    同上面的stdout-logfile,这里指定了stderr写入的日志文件位置。

四. 启动Supervisor

我们就写个最简单的Web应用吧,可以从我的这篇文章里拷一个Flask的Hello World程序,假设保存在”/home/billy/myapp/app.py”文件中。现在让我们在配置文件中,加入配置项:

[program:app]
command=python /home/billy/myapp/app.py

就这一个配置够了,然后让我们启动supervisord:

$ supervisord

注意,你可能要root来运行supervisord命令。运行该命令时,supervisord会自动在以下几个位置寻找配置文件:

  • 当前目录下的supervisord.conf
  • 当前目录下的etc/supervisord.conf
  • /etc/supervisord.conf
  • /etc/supervisor/supervisord.conf

当你的配置文件不在上述位置时,那就必须指定配置文件的位置,这时启动命令应改为:

$ supervisord -c /home/billy/supervisor/hello.conf

如果你的确想把配置文件放在自己的工作目录下,一个推荐的方式,是依然创建”/etc/supervisord.conf”文件,并在该文件的最后加上”[include]”配置块:

[include]
files = /home/billy/supervisor/*.conf

运行完supervisord命令后,你可以打开supervisord的日志文件,默认是”/tmp/supervisord.log”,你也可以通过”[supervisord]”配置块下的参数”logfile”来指定。如果在日志文件中看到下面的信息,就说明Supervisor启动成功了。

2016-11-27 15:03:06,830 INFO RPC interface 'supervisor' initialized
2016-11-27 15:03:06,830 CRIT Server 'unix_http_server' running without any HTTP     authentication checking
2016-11-27 15:03:06,832 INFO daemonizing the supervisord process
2016-11-27 15:03:06,833 INFO supervisord started with pid 73469

五. 命令行客户端

让我们再打开一个控制台窗口,运行supervisorctl命令,supervisorctl同supervisord一样会自动寻找”supervisord.conf”配置文件,如果不在默认位置的话,启动时须用参数”-c”指定。

supervisorctl启动后,你将会看到一个类似Shell的交互窗口。在这个窗口中,你可以输入”status”命令查看所有子进程的状态;可以输入”stop app”或”start app”命令来关闭或启动名称为”app”的子进程;如果此时你修改了配置文件,你可以输入”reload”命令让supervisord服务重新加载配置文件。

supervisor> status
app                              RUNNING   pid 74652, uptime 0:00:34
supervisor> stop app
app: stopped
supervisor> status app
app                              STOPPED   Nov 27 10:35 PM

当你不清楚命令怎么用时,可以输入”help”查看帮助,或者类似于”help start”来查看”start”命令的帮助。

supervisor> help start
start <name>        Start a process
start <gname>:*     Start all processes in a group
start <name> <name> Start multiple processes or groups
start all       Start all processes

六. Web客户端

使用Web客户端前,你先要在配置文件中启用它,方法是添加下列配置项:

[inet_http_server]
port=*:9001
;username=user
;password=123

用户名密码是用于安全验证,不设的话任何人都可以访问。配置完毕启动supervisord服务,你就可以通过”http://localhost:9001″来访问Web客户端了。下面是页面的示例,可以看到这里允许你从Web页面上查看/启动/关闭子进程。

未分类

七. 进程组

当你要管理的子进程非常多时,Supervisor允许你将子进程分组,也就是多个子进程可以在同一组内统一管理。你只需要配置”[group:thegroupname]”块就行了。

我们可以试下,再配置一个”[program:hello]”子程序,然后加上”[group:xxx]”配置:

[program:hello]
command=python /home/billy/myapp/hello.py

[group:appgroup]
programs=app,hello

现在我们将子进程”app”和”hello”都配置在进程组”appgroup”中,启动supervisord,让我们在supervisorctl客户端下试一试:

supervisor> status appgroup:*
appgroup:app                     RUNNING   pid 75042, uptime 0:03:12
appgroup:hello                   RUNNING   pid 75043, uptime 0:03:12
supervisor> stop appgroup:*
appgroup:app: stopped
appgroup:hello: stopped
supervisor> status appgroup:*
appgroup:app                     STOPPED   Nov 27 11:05 PM
appgroup:hello                   STOPPED   Nov 27 11:05 PM

子进程名前都加了前缀”appgroup:”,这样我们使用通配符”appgroup:*”来执行的命令就对进程组内所有的子进程起效了,果然很方便。

centos7使用systemd管理supervisor进程

介绍

Systemd

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。可以通过 systemctl –version 命令来查看使用的版本

常用命令

# 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

Supervisor

Supervisor是是一个用python写的进程管理程序,不仅仅可以用来管理进程,还可以用来做开机启动。它有但不限于以下一些功能:

重启机器后,能够自启动。
平时有个方便的进程查看方式。
能够有个方便的方式重启进程。

配置方法这里就不做记录了,不过要注意,默认的配置文件里面会把一些supervisor生成的重要文件放到 /tmp 目录下面,操作系统可能会把这些文件进行删除,导致 supervisorctl 命令由于找不到这些以前放到 /tmp 的文件而操作不了已经启动的supervisor进程。

方法

为了能够在机器启动之后自动启动supervisor,需要把supervisor进程配置进systemd,

步骤:

1、进入目录 /usr/lib/systemd/system/,增加文件 supervisord.service,来使得机器启动的时候启动supervisor,文件内容

# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

2、激活开机启动命令

systemctl enable supervisord.service

3、启动supervisor进程

systemctl start supervisord.service

4、关闭supervisor进程

systemctl stop supervisord.service

5、如果修改了supervisor.service文件,可以通过reload命令来重新加载配置文件

systemctl reload supervisord.service

检查

可以通过 ps 命令可以查看supervisor 是否启动,并且可以查看supervisor管理的进程是否启动。