Supervisord是用Python实现的一款非常实用的进程管理工具,类似于monit(关于monit见我的博客:用monit监控系统关键进程),monit和supervisord的一个比较大的差异是supervisord管理的进程必须由supervisord来启动,monit可以管理已经在运行的程序;supervisord还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序,因此如果用supervisord来管理nginx的话,必须在nginx的配置文件里添加一行设置daemon off让nginx以非daemon方式启动。(此段话引用链接:http://feilong.me/2011/03/monitor-processes-with-supervisord)

注意:如果用supervisorctlstart nginx启动nginx显示错误nginx: ERROR(abnormal termination),查看日志说是nginx已经启动,这就是因为nginx本身是daemon程序,要在nginx的配置文件中把它转为非daemon程序.

1.Supervisor安装:

# 安装
    easy_install supervisor

也可采用离线安装的方式:

安装python
安装meld3-0.6.8.tar.gz

安装elementtree-1.2.6-20050316.tar.gz
安装supervisor-3.0a12.tar.gz

官方安装文档:
http://supervisord.org/installing.html

依赖软件:

setuptools (latest) from http://pypi.python.org/pypi/setuptools.
    meld3 (latest) from http://www.plope.com/software/meld3/.
    elementtree (latest) from http://effbot.org/downloads#elementtree.

2.生成默认配置文件:

# 生成默认配置文件
    echo_supervisord_conf > /etc/supervisord.conf
    mkdir /etc/supervisord.conf.d

3.修改配置文件

include区段修改为:
    [include]
    files = /etc/supervisord.conf.d/*.conf

如需要访问web控制界面,inet_http_server区段修改为:
    [inet_http_server]
    port=0.0.0.0:9001
    username=username ; 你的用户名
    password=password ; 你的密码

每个需要管理的进程分别写在一个文件里面,放在/etc/supervisord.conf.d/目录下,便于管理。例如:test.conf
    [program:sqlparse]
    directory = /var/www/python
    command = /bin/env python test.py

4.把supervisord服务设为开机自启动,把下面程序复制下来生成supervisord文件放到/etc/init.d/目录下面:

CentOS环境下:

#!/bin/sh
    #
    # /etc/rc.d/init.d/supervisord
    #
    # Supervisor is a client/server system that
    # allows its users to monitor and control a
    # number of processes on UNIX-like operating
    # systems.
    #
    # chkconfig: - 64 36
    # description: Supervisor Server
    # processname: supervisord
     
    # Source init functions
    . /etc/init.d/functions
     
    RETVAL=0
    prog="supervisord"
    pidfile="/tmp/supervisord.pid"
    lockfile="/var/lock/subsys/supervisord"
     
    start()
    {
            echo -n $"Starting $prog: "
            daemon --pidfile $pidfile supervisord -c /etc/supervisord.conf
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch ${lockfile}
    }
     
    stop()
    {
            echo -n $"Shutting down $prog: "
            killproc -p ${pidfile} /usr/bin/supervisord
            RETVAL=$?
            echo
            if [ $RETVAL -eq 0 ] ; then
                    rm -f ${lockfile} ${pidfile}
            fi
    }
     
    case "$1" in
     
      start)
        start
      ;;
     
      stop)
        stop
      ;;
     
      status)
            status $prog
      ;;
     
      restart)
        stop
        start
      ;;
     
      *)
        echo "Usage: $0 {start|stop|restart|status}"
      ;;
     
    esac

Ubuntu环境下:

#! /bin/sh
    ### BEGIN INIT INFO
    # Provides:          supervisord
    # Required-Start:    $remote_fs
    # Required-Stop:     $remote_fs
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Example initscript
    # Description:       This file should be used to construct scripts to be
    #                    placed in /etc/init.d.
    ### END INIT INFO
     
    # Author: Dan MacKinlay <danielm@phm.gov.au>
    # Based on instructions by Bertrand Mathieu
    # http://zebert.blogspot.com/2009/05/installing-django-solr-varnish-and.html
     
    # Do NOT "set -e"
     
    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Description of the service"
    NAME=supervisord
    DAEMON=/usr/local/bin/supervisord
    DAEMON_ARGS=""
    PIDFILE=/tmp/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
     
    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0
     
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
     
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
     
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
     
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
            || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
            $DAEMON_ARGS \
            || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
    }
     
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
    }
     
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
    }
     
    case "$1" in
      start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
      restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
              # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
      *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
    esac
     
    :

用root用户执行下面命令把supervisord服务设为开机自启动:

CentOS系统下:

chmod +x /etc/init.d/supervisord
    chkconfig supervisord on
    service supervisord start

Ubuntu系统下:

chmod +x /etc/init.d/supervisord
    update-rc.d supervisord defaults

5.supervisord管理

Supervisord安装完成后有两个可用的命令行supervisor和supervisorctl,命令使用解释如下:

supervisord,初始启动Supervisord,启动、管理配置中设置的进程。
    supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。
    supervisorctl start programxxx,启动某个进程
    supervisorctl restart programxxx,重启某个进程
    supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)
    supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
    supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
    supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
    注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

6.supervisord的配置文件(/etc/supervisord.conf)

; Sample supervisor config file.
    ;
    ; For more information on the config file, please see:
    ; http://supervisord.org/configuration.html
    ;
    ; Note: shell expansion ("~" or "$HOME") is not supported.  Environment
    ; variables can be expanded using this syntax: "%(ENV_HOME)s".
     
    [unix_http_server]
    file=/tmp/supervisor.sock   ; (the path to the socket file)
    ;chmod=0700                 ; socket file mode (default 0700)
    ;chown=nobody:nogroup       ; socket file uid:gid owner
    ;username=user              ; (default is no username (open server))
    ;password=123               ; (default is no password (open server))
     
    ;[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))
     
    [inet_http_server]         ; inet (TCP) server disabled by default
    port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)
    username=supervisor              ; (default is no username (open server))
    password=supervisor               ; (default is no password (open server))
     
    [supervisord]
    logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
    logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
    logfile_backups=10           ; (num of main logfile rotation backups;default 10)
    loglevel=info                ; (log level;default info; others: debug,warn,trace)
    pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
    nodaemon=false               ; (start in foreground if true;default false)
    minfds=1024                  ; (min. avail startup file descriptors;default 1024)
    minprocs=200                 ; (min. avail process descriptors;default 200)
    ;umask=022                   ; (process file creation umask;default 022)
    ;user=chrism                 ; (default is current user, required if root)
    ;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')
    ;directory=/tmp              ; (default is not to cd during start)
    ;nocleanup=true              ; (don't clean up tempfiles at start;default false)
    ;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
    ;environment=KEY="value"     ; (key value pairs to add to environment)
    ;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)
    ; 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:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
    ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
    ;username=chris              ; should be same as http_username if set
    ;password=123                ; should be same as http_password if set
    ;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
    ;history_file=~/.sc_history  ; use readline history if available
    ; The below sample program section shows all possible program subsection values,
    ; create one or more 'real' program: sections to be able to control them under
    ; supervisor.
    ;[program:theprogramname]
    ;command=/bin/cat              ; the program (relative uses PATH, can take args)
    ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
    ;numprocs=1                    ; number of processes copies to start (def 1)
    ;directory=/tmp                ; directory to cwd to before exec (def no cwd)
    ;umask=022                     ; umask for process (default None)
    ;priority=999                  ; the relative start priority (default 999)
    ;autostart=true                ; start at supervisord start (default: true)
    ;autorestart=unexpected        ; whether/when to restart (default: unexpected)
    ;startsecs=1                   ; number of secs prog must stay running (def. 1)
    ;startretries=3                ; max # of serial start failures (default 3)
    ;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
    ;stopsignal=QUIT               ; signal used to kill process (default TERM)
    ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
    ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
    ;killasgroup=false             ; SIGKILL the UNIX process group (def false)
    ;user=chrism                   ; setuid to this UNIX account to run the program
    ;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
    ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
    ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
    ;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
    ;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
    ;stdout_events_enabled=false   ; emit events on stdout writes (default false)
    ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
    ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
    ;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
    ;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
    ;stderr_events_enabled=false   ; emit events on stderr writes (default false)
    ;environment=A="1",B="2"       ; process environment additions (def no adds)
    ;serverurl=AUTO                ; override serverurl computation (childutils)
    ; The below sample eventlistener section shows all possible
    ; eventlistener subsection values, create one or more 'real'
    ; eventlistener: sections to be able to handle event notifications
    ; sent by supervisor.
    ;[eventlistener:theeventlistenername]
    ;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
    ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
    ;numprocs=1                    ; number of processes copies to start (def 1)
    ;events=EVENT                  ; event notif. types to subscribe to (req'd)
    ;buffer_size=10                ; event buffer queue size (default 10)
    ;directory=/tmp                ; directory to cwd to before exec (def no cwd)
    ;umask=022                     ; umask for process (default None)
    ;priority=-1                   ; the relative start priority (default -1)
    ;autostart=true                ; start at supervisord start (default: true)
    ;autorestart=unexpected        ; whether/when to restart (default: unexpected)
    ;startsecs=1                   ; number of secs prog must stay running (def. 1)
    ;startretries=3                ; max # of serial start failures (default 3)
    ;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
    ;stopsignal=QUIT               ; signal used to kill process (default TERM)
    ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
    ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
    ;killasgroup=false             ; SIGKILL the UNIX process group (def false)
    ;user=chrism                   ; setuid to this UNIX account to run the program
    ;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
    ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
    ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
    ;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
    ;stdout_events_enabled=false   ; emit events on stdout writes (default false)
    ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
    ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
    ;stderr_logfile_backups        ; # of stderr logfile backups (default 10)
    ;stderr_events_enabled=false   ; emit events on stderr writes (default false)
    ;environment=A="1",B="2"       ; process environment additions
    ;serverurl=AUTO                ; override serverurl computation (childutils)
    ; The below sample group section shows all possible group values,
    ; create one or more 'real' group: sections to create "heterogeneous"
    ; process groups.
     
    ;[group:thegroupname]
    ;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
    ;priority=999                  ; the relative start priority (default 999)
     
    ; The [include] section can just contain the "files" setting.  This
    ; setting can list multiple files (separated by whitespace or
    ; newlines).  It can also contain wildcards.  The filenames are
    ; interpreted as relative to this file.  Included files *cannot*
    ; include files themselves.
     
    ;[include]
    ;files = relative/directory/*.ini
     
    [include]
    files = /etc/supervisord.conf.d/*.conf

7.管理实例

7.1.测试一个简单的python程序:

在/etc/supervisord.conf.d/目录下生成testsupervisor.conf文件

[program:testsupervisor]
    directory = /opt/testsupervisor
    command = /usr/local/bin/python testsupervisor.py
    priority=1
    numprocs=1
    autostart=true
    autorestart=true

directory表示testsupervisor.py所在的工作目录

command表示执行的命令,注意python要用绝对路径:/usr/local/bin/python

priority表示优先级,用supervisord管理的程序会按优先级从高到低依次启动,数字越多,优先级越高

autostart表示自动启动

autorestart表示自动重启

7.2.用supervisord管理 redis程序:

在/etc/supervisord.conf.d/目录下生成redis.conf文件

[program:redis]
    directory=/usr/local/src/redis-2.6.16
    command=/usr/local/src/redis-2.6.16/src/redis-server redis.conf
     
    stdout_logfile=/tmp/redis_access.log
    stderr_logfile=/tmp/redis_error.log
    autostart=true
    autorestart=true
    startsecs=10
     
    ; Need to wait for currently executing tasks to finish at shutdown.
    ; Increase this if you have very long running tasks.
    stopwaitsecs = 600
     
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=10

7.3.用supervisord管理nginx程序,因为nginx默认就是以daemon方式启动的,所以如果用supervisord来管理nginx的话,必须在nginx的配置文件里添加一行设置daemon off让nginx以非daemon方式启动。(supervisord还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序)

在/usr/local/nginx/conf/目录下面修改nginx.conf文件:

worker_processes 2;
    daemon off;
    events {
    #use epoll;
    worker_connections 1024;
    }
    http{
            #gzip on;
            #gzip_min_length  100;
            #gzip_buffers     4 16k;
            #gzip_http_version 1.0;
            #gzip_comp_level 2;
            #gzip_types       text/plain application/x-javascript text/css application/xml;
            #gzip_vary on;
     
            upstream 192.168.56.11 {
            #这里指定多个源服务器,ip:端口,80端口的话可写可不写  
                    server 127.0.0.1:8003;
                    server 127.0.0.1:8004;
                    server 127.0.0.1:8005;
                    server 127.0.0.1:8006;
     
            }
            server {
                    listen 8010;
                    location / {
                            #rewrite ^/smmp/servletsendmoremsg\.do$ /send last;
                            proxy_redirect off;
                            proxy_set_header Host    $host;
                            proxy_set_header X-Forwarded-For $remote_addr;
                            proxy_pass http://192.168.56.11;
     
                    }
     
            }
     
    #       server {
    #               listen 443;
    #                ssl                  on;
    #               ssl_certificate      server.crt;
    #               ssl_certificate_key  server.key;
    #
    #               ssl_session_timeout  5m;
    #
    #               ssl_protocols  SSLv2 SSLv3 TLSv1;
    #               ssl_ciphers  HIGH:!aNULL:!MD5;
    #               ssl_prefer_server_ciphers   on;
    #               location / {
    #                        proxy_redirect off;
    #                        proxy_set_header Host    $host;
    #                        proxy_set_header X-Forwarded-For $remote_addr;
    #                        proxy_pass http://192.168.56.11;
    #
    #                }
    #               
    #       }  
    }

在/etc/supervisord.conf.d/目录下生成nginx.conf文件

[program:nginx]
    command=/usr/local/nginx/sbin/nginx
     
    stdout_logfile=/tmp/nginx.log
    stderr_logfile=/tmp/nginx.log
    autostart=true
    autorestart=true
    startsecs=10
     
    ; Need to wait for currently executing tasks to finish at shutdown.
    ; Increase this if you have very long running tasks.
    stopwaitsecs = 600
     
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=55

7.4.用supervisord管理celery服务(python环境下):

celery官方链接:https://github.com/celery/celery/tree/3.0/extra/supervisord

在/etc/supervisord.conf.d/目录下生成celeryd.conf文件,启了两个worker,配置文件中要注意celeryconfig.py的路径:

; ============================
    ;  celeryd supervisor example
    ; ============================
     
    ; NOTE: If you're using Django, you shouldn't use this file.
    ; Use
    ; http://github.com/celery/django-celery/tree/master/extra/supervisord/celeryd.conf
    ; instead!
     
    [program:celery]
    command=/usr/local/bin/celery worker --loglevel INFO --queues=low_send_task_queue,high_send_task_queue
     
    process_name = %(program_name)s-%(process_num)d
     
    ; Set PYTHONPATH to the directory containing celeryconfig.py
    environment=PYTHONPATH=/usr/local/workspace_eclipse3.7.2/venus
     
    directory=/usr/local/workspace_eclipse3.7.2/venus
     
    numprocs=2
    stdout_logfile=/tmp/celery_sendsms_access.log
    stderr_logfile=/tmp/celery_sendsms_error.log
    autostart=true
    autorestart=true
    startsecs=10
     
    ; Need to wait for currently executing tasks to finish at shutdown.
    ; Increase this if you have very long running tasks.
    stopwaitsecs = 600
     
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=998

7.5.用supervisord管理celery服务(django环境下):

在/etc/supervisord.conf.d/目录下生成celeryd_worker.conf文件

; ==============================================
    ;  celery worker supervisor example for Django
    ; ==============================================
     
    [program:celeryworker]
    command=/usr/local/bin/python manage.py celery worker --loglevel=INFO --queues=db_write_back_queue
    directory=/usr/local/workspace_eclipse3.7.2/sms_web
     
    numprocs=1
    stdout_logfile=/tmp/celeryworker.log
    stderr_logfile=/tmp/celeryworker.log
    autostart=true
    autorestart=true
    startsecs=10
     
    ; Need to wait for currently executing tasks to finish at shutdown.
    ; Increase this if you have very long running tasks.
    stopwaitsecs = 600
     
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=15
     
    ;process_name = %(program_name)s-%(process_num)d
    ;numprocs=2

在/etc/supervisord.conf.d/目录下生成celeryd_beat.conf文件,django环境下的心跳服务

; ==============================================
    ;  celery worker supervisor example for Django
    ; ==============================================
     
    [program:celerybeat]
    command=/usr/local/bin/python manage.py celery beat -s /var/log/sms_web/celerybeat-schedule --loglevel=INFO
    directory=/usr/local/workspace_eclipse3.7.2/sms_web
     
    numprocs=1
    stdout_logfile=/tmp/celerybeat.log
    stderr_logfile=/tmp/celerybeat.log
    autostart=true
    autorestart=true
    startsecs=10
     
    ; Need to wait for currently executing tasks to finish at shutdown.
    ; Increase this if you have very long running tasks.
    stopwaitsecs = 600
     
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=14
     
    ;process_name = %(program_name)s-%(process_num)d
    ;numprocs=2

7.6.用supervisord管理venus服务(启了四个进程):

在/etc/supervisord.conf.d/目录下生成venux.conf文件

[program:venus-8003]
    directory=/usr/local/workspace_eclipse3.7.2/venus
    command=/usr/local/bin/python main.py --port=8003
    stdout_logfile=/tmp/venus_8003.log
    stderr_logfile=/tmp/venus_8003.log
    autostart=true
    autorestart=true
    priority=50
     
    [program:venus-8004]
    directory=/usr/local/workspace_eclipse3.7.2/venus
    command=/usr/local/bin/python main.py --port=8004
    stdout_logfile=/tmp/venus_8004.log
    stderr_logfile=/tmp/venus_8004.log
    autostart=true
    autorestart=true
    priority=51
     
    [program:venus-8005]
    directory=/usr/local/workspace_eclipse3.7.2/venus
    command=/usr/local/bin/python main.py --port=8005
    stdout_logfile=/tmp/venus_8005.log
    stderr_logfile=/tmp/venus_8005.log
    autostart=true
    autorestart=true
    priority=52
     
    [program:venus-8006]
    directory=/usr/local/workspace_eclipse3.7.2/venus
    command=/usr/local/bin/python main.py --port=8006
    stdout_logfile=/tmp/venus_8006.log
    stderr_logfile=/tmp/venus_8006.log
    autostart=true
    autorestart=true
    priority=53
    ~

7.7.用supervisord管理接收短信的服务:

在/etc/supervisord.conf.d/目录下生成receiver_cmpp.conf文件

[program:receiver-cmpp]
    directory=/usr/local/workspace_eclipse3.7.2/sms_tool
    command=/usr/local/bin/python receiver_cmpp.py
     
    stdout_logfile=/tmp/receiver_cmpp.log
    stderr_logfile=/tmp/receiver_cmpp.log
    autostart=true
    autorestart=true
    startsecs=10
     
    ; Need to wait for currently executing tasks to finish at shutdown.
    ; Increase this if you have very long running tasks.
    stopwaitsecs = 600
     
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=21

在/etc/supervisord.conf.d/目录下添加新的配置文件后,执行命令:

supervisorctl update

就会把新添加的服务启动起来,且不会影响正在运行的 服务。

---------------------  
作者:shanliangliuxing  
来源:CSDN  
原文:https://blog.csdn.net/shanliangliuxing/article/details/15499891  
版权声明:本文为博主原创文章,转载请附上博文链接!

supervisor安装部署文档和管理实例的更多相关文章

  1. keepalived双机热备,安装部署文档

    keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...

  2. LVS+Heartbeat安装部署文档

    LVS+Heartbeat安装部署文档 发表回复 所需软件: ipvsadm-1.24-10.x86_64.rpmheartbeat-2.1.3-3.el5.centos.x86_64.rpmhear ...

  3. Sqlserver2008安装部署文档

    Sqlserver2008部署文档 注意事项: 如果你要安装的是64位的服务器,并且是新机器.那么请注意,你需要首先需要给64系统安装一个.net framework,如果已经安装此功能,请略过这一步 ...

  4. zabbix3.0安装部署文档

    zabbix v3.0安装部署 摘要: 本文的安装过程摘自http://www.ttlsa.com/以及http://b.lifec-inc.com ,和站长凉白开的<ZABBIX从入门到精通v ...

  5. MetaQ安装部署文档

    一.MetaQ安装部署情况: 地点 IP Broker ID Master/Slave Slave ID:Group 合肥 192.168.52.23 Slave 1:meta-slave-group ...

  6. OpenPAI大规模人工智能平台安装部署文档

    环境要求: 如果需要图形界面,需要在Ubuntu系统安装,否则centos系统安装时是没有问题的(web端和命令行进行任务提交) 安装过程需要有另外一台控制端机器(注意:区别于集群所在的任何一台服务器 ...

  7. Oracle Grid Infrastructure安装部署文档

    1. 部署环境步骤 1.1 软件环境 操作系统: CentOS release 6.5 oracle安装包: linux.x64_11gR2_grid.zip linux.x64_11gR2_data ...

  8. 1. Oracle安装部署文档

    一. 部署环境步骤 1.1 软件环境 操作系统:CentOS release 6.5oracle安装包:linux.x64_11gR2_database_1of1.zip:linux.x64_11gR ...

  9. Haproxy安装部署文档及多配置文件管理方案

    一.部署安装 二.软件配置 三.系统服务 四.日志配置 五.小结 文章目录 最近我在负责一个统一接入层的建设项目,涉及到 Haproxy 和 ospf 的运维部署,本文分享一下我在部署 Haproxy ...

随机推荐

  1. word中的总页数不包括封面、目录

    删除分隔符:选项-显示-显示所有格式标记

  2. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之CDN内容分发网络

    背景分析 EasyDSS流媒体解决方案提供一站式的转码.点播.直播.录像.检索.时移回放服务,极大地简化了开发和集成的工作,并且EasyDSS支持多种特性,完全能够满足企业视频信息化建设方面的需求.其 ...

  3. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之点播分享

    背景介绍 EasyDSS流媒体服务器软件,提供一站式的视频上传.转码.点播.直播.时移回放等服务,极大地简化了开发和集成的工作.其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像 ...

  4. axios get,post请求时带headers

    axios post请求时带headers: axios.post("http://xxx.com/xxx/xxx/xxx?", { 'queslistid': this.kemu ...

  5. spark 性能优化简要总结

    1.从同一个数据源尽量只创建一个rdd,后续业务逻辑复用该rdd2.如果要对某个rdd进行多次的transformation或action操作,应当持久化该rdd3.从数据源读取到rdd后,要尽早的进 ...

  6. strace调试工具编译移植

     源码下载:https://github.com/strace/strace/releases/tag/v4.18(使用的较老版本,最新版 5.4 编译时依赖较多,最终博主放弃使用) [ 编译步骤 ] ...

  7. PAT 1093

    The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...

  8. docker关系图解析

    docker关系图解析 一.docker有5种状态 Dockerfile 文本文件,制作images的配置文件 images image,静态文件 containers container image ...

  9. count_if 功能模板

    count_if 功能模板 template <class InputIterator, class UnaryPredicate> typename iterator_traits< ...

  10. Robot Arms AtCoder - 4432 (构造)

    大意: 给定平面上$n$个点$(x_i,y_i)$. 要求构造一个序列$d$, $d_i$表示每步走的距离, 再构造$n$个命令串, 要求从原点出发按照第$i$个命令走, 走完恰好到达$(x_i,y_ ...