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. siglongjmp和sigsetjmp 用法

    1. 引入原因 由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sig ...

  2. 【论文阅读】3DMM-A Morphable Model for The Synthesis of 3D Faces

    前言 参考 1. 2. 完

  3. (转) C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库

    原贴链接:https://www.cnblogs.com/mq0036/p/11052359.html C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracl ...

  4. ThreadLocal源代码1

    public class ThreadLocalTrxt { static ThreadLocal<Object> x1 = new ThreadLocal<Object>() ...

  5. AntV设置Chart高度

    AntV在使用柱状图时不能单独设置一个柱状图的宽度,但可以设置整体高度,宽度,代码如下 const chart = new F2.Chart({ id: 'c1', // 指定图表容器 ID widt ...

  6. RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】

    每篇一句 人圆月圆心圆,人和家和国和---中秋节快乐 前言 在阅读本篇之前,建议先阅读开山篇效果更佳.RestTemplate是Spring提供的用于访问Rest服务的客户端工具,它提供了多种便捷访问 ...

  7. MySQL单机优化---分表、分区、分库

    一.分表: 水平分表:根据条件把数据分为N个表(例如:商品表中有月份列,则可以按月份进行水平分表). 使用场景:一张表中数据太多,查询效率太慢. 当需要同时查询被水平分表的多张表时: 在两条SQL语句 ...

  8. php 函数篇

    1.array_values($data); 注:将关联数组转化为索引数组 <?php $a=array("Name"=>"Bill"," ...

  9. 嵌入式web服务器BOA+CGI+HTML+MySQL项目实战——Linux

    准备环境操作系统: Ubuntu12.04 LTS环境搭建: 需要 BOA,Apache,CCGI,MySQL,GCC[Linux下嵌入式Web服务器BOA和CGI编程开发][数据库的相关知识——学习 ...

  10. 【数据结构】12.java源码关于ConcurrentHashMap

    目录 1.ConcurrentMap的内部结构 2.ConcurrentMap构造函数 3.元素新增策略4.元素删除5.元素修改和查找6.特殊操作7.扩容8.总结 1.ConcurrentMap内部结 ...