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  
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. featherview模板引擎
  2. OSX的一些基本知识
  3. frame busting
  4. oracle通过sequence定义触发器支持id的自增
  5. Oracle Spatial中SDO_Geometry详细说明[转]
  6. clumsy 0.1 测试工具(延迟\掉包\节流\重发\乱序\篡改)
  7. 发布在IIS上的Web程序,调用服务器的COM组件
  8. 最近在学习UDP方面的通信,找到一个很棒的博客
  9. dom方法读取xml(不常用)
  10. 浙大PAT 7-06 题解
  11. 基于Windows环境下MyEclipse10快捷键总结
  12. 【Alpha】随笔集合
  13. SQL Server 创建索引方法
  14. 怎么用npm发布一个包,详细教程
  15. loss函数学习笔记
  16. Luogu P2827 蚯蚓
  17. Spark SQL 函数全集
  18. 最受欢迎的前端框架 —— Bootstrap学习
  19. HDU 3970 Harmonious Set 容斥欧拉函数
  20. Java中的内部类(一)静态内部类

热门文章

  1. 大数据 -- Cloudera Manager(简称CM)+CDH构建大数据平台
  2. Multi-Channel Buffers
  3. 封装redis操作 php版本
  4. 使用termux在安卓手机上搭建python开发环境
  5. log4j Logger 使用简介
  6. mybatis-3.5.2增删查改
  7. Endpoint is unreachable and there is no snapshot available for offline browsing
  8. [转帖]OLTP、OLAP与HTAP
  9. jdk的下载路径和环境变量的配置
  10. js中Boolean类型和Number类型的一些常见方法