Supervisord是用Python实现的一款非常实用的进程管理工具,类似于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安装:
1 # 安装 2 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
依赖软件:
1 setuptools (latest) from http://pypi.python.org/pypi/setuptools. 2 meld3 (latest) from http://www.plope.com/software/meld3/. 3 elementtree (latest) from http://effbot.org/downloads#elementtree.
2.生成默认配置文件:
1 # 生成默认配置文件 2 echo_supervisord_conf > /etc/supervisord.conf 3 mkdir /etc/supervisord.conf.d
3.修改配置文件
1 include区段修改为: 2 [include] 3 files = /etc/supervisord.conf.d/*.conf
1 每个需要管理的进程分别写在一个文件里面,放在/etc/supervisord.conf.d/目录下,便于管理。例如:test.conf 2 [program:sqlparse] 3 directory = /var/local/python 4 command = /use/bin python test.py
4.把supervisord服务设为开机自启动,把下面程序复制下来生成supervisord文件放到/etc/init.d/目录下面:
CentOS环境下:
1 #!/bin/sh 2 # 3 # /etc/rc.d/init.d/supervisord 4 # 5 # Supervisor is a client/server system that 6 # allows its users to monitor and control a 7 # number of processes on UNIX-like operating 8 # systems. 9 # 10 # chkconfig: - 64 36 11 # description: Supervisor Server 12 # processname: supervisord 13 14 # Source init functions 15 . /etc/init.d/functions 16 17 RETVAL=0 18 prog="supervisord" 19 pidfile="/tmp/supervisord.pid" 20 lockfile="/var/lock/subsys/supervisord" 21 22 start() 23 { 24 echo -n $"Starting $prog: " 25 daemon --pidfile $pidfile supervisord -c /etc/supervisord.conf 26 RETVAL=$? 27 echo 28 [ $RETVAL -eq 0 ] && touch ${lockfile} 29 } 30 31 stop() 32 { 33 echo -n $"Shutting down $prog: " 34 killproc -p ${pidfile} /usr/bin/supervisord 35 RETVAL=$? 36 echo 37 if [ $RETVAL -eq 0 ] ; then 38 rm -f ${lockfile} ${pidfile} 39 fi 40 } 41 42 case "$1" in 43 44 start) 45 start 46 ;; 47 48 stop) 49 stop 50 ;; 51 52 status) 53 status $prog 54 ;; 55 56 restart) 57 stop 58 start 59 ;; 60 61 *) 62 echo "Usage: $0 {start|stop|restart|status}" 63 ;; 64 65 esac
Ubuntu环境下:
1 #! /bin/sh 2 ### BEGIN INIT INFO 3 # Provides: supervisord 4 # Required-Start: $remote_fs 5 # Required-Stop: $remote_fs 6 # Default-Start: 2 3 4 5 7 # Default-Stop: 0 1 6 8 # Short-Description: Example initscript 9 # Description: This file should be used to construct scripts to be 10 # placed in /etc/init.d. 11 ### END INIT INFO 12 13 # Author: Dan MacKinlay <danielm@phm.gov.au> 14 # Based on instructions by Bertrand Mathieu 15 # http://zebert.blogspot.com/2009/05/installing-django-solr-varnish-and.html 16 17 # Do NOT "set -e" 18 19 # PATH should only include /usr/* if it runs after the mountnfs.sh script 20 PATH=/sbin:/usr/sbin:/bin:/usr/bin 21 DESC="Description of the service" 22 NAME=supervisord 23 DAEMON=/usr/local/bin/supervisord 24 DAEMON_ARGS="" 25 PIDFILE=/tmp/$NAME.pid 26 SCRIPTNAME=/etc/init.d/$NAME 27 28 # Exit if the package is not installed 29 [ -x "$DAEMON" ] || exit 0 30 31 # Read configuration variable file if it is present 32 [ -r /etc/default/$NAME ] && . /etc/default/$NAME 33 34 # Load the VERBOSE setting and other rcS variables 35 . /lib/init/vars.sh 36 37 # Define LSB log_* functions. 38 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. 39 . /lib/lsb/init-functions 40 41 # 42 # Function that starts the daemon/service 43 # 44 do_start() 45 { 46 # Return 47 # 0 if daemon has been started 48 # 1 if daemon was already running 49 # 2 if daemon could not be started 50 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null 51 || return 1 52 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- 53 $DAEMON_ARGS 54 || return 2 55 # Add code here, if necessary, that waits for the process to be ready 56 # to handle requests from services started subsequently which depend 57 # on this one. As a last resort, sleep for some time. 58 } 59 60 # 61 # Function that stops the daemon/service 62 # 63 do_stop() 64 { 65 # Return 66 # 0 if daemon has been stopped 67 # 1 if daemon was already stopped 68 # 2 if daemon could not be stopped 69 # other if a failure occurred 70 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 71 RETVAL="$?" 72 [ "$RETVAL" = 2 ] && return 2 73 # Wait for children to finish too if this is a daemon that forks 74 # and if the daemon is only ever run from this initscript. 75 # If the above conditions are not satisfied then add some other code 76 # that waits for the process to drop all resources that could be 77 # needed by services started subsequently. A last resort is to 78 # sleep for some time. 79 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON 80 [ "$?" = 2 ] && return 2 81 # Many daemons don't delete their pidfiles when they exit. 82 rm -f $PIDFILE 83 return "$RETVAL" 84 } 85 86 # 87 # Function that sends a SIGHUP to the daemon/service 88 # 89 do_reload() { 90 # 91 # If the daemon can reload its configuration without 92 # restarting (for example, when it is sent a SIGHUP), 93 # then implement that here. 94 # 95 start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME 96 return 0 97 } 98 99 case "$1" in 100 start) 101 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 102 do_start 103 case "$?" in 104 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 105 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 106 esac 107 ;; 108 stop) 109 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" 110 do_stop 111 case "$?" in 112 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 113 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 114 esac 115 ;; 116 #reload|force-reload) 117 # 118 # If do_reload() is not implemented then leave this commented out 119 # and leave 'force-reload' as an alias for 'restart'. 120 # 121 #log_daemon_msg "Reloading $DESC" "$NAME" 122 #do_reload 123 #log_end_msg $? 124 #;; 125 restart|force-reload) 126 # 127 # If the "reload" option is implemented then remove the 128 # 'force-reload' alias 129 # 130 log_daemon_msg "Restarting $DESC" "$NAME" 131 do_stop 132 case "$?" in 133 0|1) 134 do_start 135 case "$?" in 136 0) log_end_msg 0 ;; 137 1) log_end_msg 1 ;; # Old process is still running 138 *) log_end_msg 1 ;; # Failed to start 139 esac 140 ;; 141 *) 142 # Failed to stop 143 log_end_msg 1 144 ;; 145 esac 146 ;; 147 *) 148 #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 149 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 150 exit 3 151 ;; 152 esac
用root用户执行下面命令把supervisord服务设为开机自启动:
CentOS系统下:
1 chmod +x /etc/init.d/supervisord 2 chkconfig supervisord on 3 service supervisord start
Ubuntu系统下:
1 chmod +x /etc/init.d/supervisord 2 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)
1 ; Sample supervisor config file. 2 ; 3 ; For more information on the config file, please see: 4 ; http://supervisord.org/configuration.html 5 ; 6 ; Note: shell expansion ("~" or "$HOME") is not supported. Environment 7 ; variables can be expanded using this syntax: "%(ENV_HOME)s". 8 9 [unix_http_server] 10 file=/tmp/supervisor.sock ; (the path to the socket file) 11 ;chmod=0700 ; socket file mode (default 0700) 12 ;chown=nobody:nogroup ; socket file uid:gid owner 13 ;username=user ; (default is no username (open server)) 14 ;password=123 ; (default is no password (open server)) 15 16 ;[inet_http_server] ; inet (TCP) server disabled by default 17 ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) 18 ;username=user ; (default is no username (open server)) 19 ;password=123 ; (default is no password (open server)) 20 21 [inet_http_server] ; inet (TCP) server disabled by default 22 port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface) 23 username=supervisor ; (default is no username (open server)) 24 password=supervisor ; (default is no password (open server)) 25 26 [supervisord] 27 logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log) 28 logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) 29 logfile_backups=10 ; (num of main logfile rotation backups;default 10) 30 loglevel=info ; (log level;default info; others: debug,warn,trace) 31 pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) 32 nodaemon=false ; (start in foreground if true;default false) 33 minfds=1024 ; (min. avail startup file descriptors;default 1024) 34 minprocs=200 ; (min. avail process descriptors;default 200) 35 ;umask=022 ; (process file creation umask;default 022) 36 ;user=chrism ; (default is current user, required if root) 37 ;identifier=supervisor ; (supervisord identifier, default is 'supervisor') 38 ;directory=/tmp ; (default is not to cd during start) 39 ;nocleanup=true ; (don't clean up tempfiles at start;default false) 40 ;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP) 41 ;environment=KEY="value" ; (key value pairs to add to environment) 42 ;strip_ansi=false ; (strip ansi escape codes in logs; def. false) 43 44 ; the below section must remain in the config file for RPC 45 ; (supervisorctl/web interface) to work, additional interfaces may be 46 ; added by defining them in separate rpcinterface: sections 47 [rpcinterface:supervisor] 48 supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 49 50 [supervisorctl] 51 serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket 52 ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket 53 ;username=chris ; should be same as http_username if set 54 ;password=123 ; should be same as http_password if set 55 ;prompt=mysupervisor ; cmd line prompt (default "supervisor") 56 ;history_file=~/.sc_history ; use readline history if available 57 58 ; The below sample program section shows all possible program subsection values, 59 ; create one or more 'real' program: sections to be able to control them under 60 ; supervisor. 61 62 ;[program:theprogramname] 63 ;command=/bin/cat ; the program (relative uses PATH, can take args) 64 ;process_name=%(program_name)s ; process_name expr (default %(program_name)s) 65 ;numprocs=1 ; number of processes copies to start (def 1) 66 ;directory=/tmp ; directory to cwd to before exec (def no cwd) 67 ;umask=022 ; umask for process (default None) 68 ;priority=999 ; the relative start priority (default 999) 69 ;autostart=true ; start at supervisord start (default: true) 70 ;autorestart=unexpected ; whether/when to restart (default: unexpected) 71 ;startsecs=1 ; number of secs prog must stay running (def. 1) 72 ;startretries=3 ; max # of serial start failures (default 3) 73 ;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) 74 ;stopsignal=QUIT ; signal used to kill process (default TERM) 75 ;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) 76 ;stopasgroup=false ; send stop signal to the UNIX process group (default false) 77 ;killasgroup=false ; SIGKILL the UNIX process group (def false) 78 ;user=chrism ; setuid to this UNIX account to run the program 79 ;redirect_stderr=true ; redirect proc stderr to stdout (default false) 80 ;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO 81 ;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) 82 ;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10) 83 ;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) 84 ;stdout_events_enabled=false ; emit events on stdout writes (default false) 85 ;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO 86 ;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) 87 ;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10) 88 ;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) 89 ;stderr_events_enabled=false ; emit events on stderr writes (default false) 90 ;environment=A="1",B="2" ; process environment additions (def no adds) 91 ;serverurl=AUTO ; override serverurl computation (childutils) 92 93 ; The below sample eventlistener section shows all possible 94 ; eventlistener subsection values, create one or more 'real' 95 ; eventlistener: sections to be able to handle event notifications 96 ; sent by supervisor. 97 98 ;[eventlistener:theeventlistenername] 99 ;command=/bin/eventlistener ; the program (relative uses PATH, can take args) 100 ;process_name=%(program_name)s ; process_name expr (default %(program_name)s) 101 ;numprocs=1 ; number of processes copies to start (def 1) 102 ;events=EVENT ; event notif. types to subscribe to (req'd) 103 ;buffer_size=10 ; event buffer queue size (default 10) 104 ;directory=/tmp ; directory to cwd to before exec (def no cwd) 105 ;umask=022 ; umask for process (default None) 106 ;priority=-1 ; the relative start priority (default -1) 107 ;autostart=true ; start at supervisord start (default: true) 108 ;autorestart=unexpected ; whether/when to restart (default: unexpected) 109 ;startsecs=1 ; number of secs prog must stay running (def. 1) 110 ;startretries=3 ; max # of serial start failures (default 3) 111 ;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) 112 ;stopsignal=QUIT ; signal used to kill process (default TERM) 113 ;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) 114 ;stopasgroup=false ; send stop signal to the UNIX process group (default false) 115 ;killasgroup=false ; SIGKILL the UNIX process group (def false) 116 ;user=chrism ; setuid to this UNIX account to run the program 117 ;redirect_stderr=true ; redirect proc stderr to stdout (default false) 118 ;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO 119 ;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) 120 ;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10) 121 ;stdout_events_enabled=false ; emit events on stdout writes (default false) 122 ;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO 123 ;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) 124 ;stderr_logfile_backups ; # of stderr logfile backups (default 10) 125 ;stderr_events_enabled=false ; emit events on stderr writes (default false) 126 ;environment=A="1",B="2" ; process environment additions 127 ;serverurl=AUTO ; override serverurl computation (childutils) 128 129 ; The below sample group section shows all possible group values, 130 ; create one or more 'real' group: sections to create "heterogeneous" 131 ; process groups. 132 133 ;[group:thegroupname] 134 ;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions 135 ;priority=999 ; the relative start priority (default 999) 136 137 ; The [include] section can just contain the "files" setting. This 138 ; setting can list multiple files (separated by whitespace or 139 ; newlines). It can also contain wildcards. The filenames are 140 ; interpreted as relative to this file. Included files *cannot* 141 ; include files themselves. 142 143 ;[include] 144 ;files = relative/directory/*.ini 145 146 [include] 147 files = /etc/supervisord.conf.d/*.conf
7.管理实例
7.1.测试一个简单的python程序:
在/etc/supervisord.conf.d/目录下生成testsupervisor.conf文件
1 [program:testsupervisor] 2 directory = /opt/testsupervisor 3 command = /usr/local/bin/python testsupervisor.py 4 priority=1 5 numprocs=1 6 autostart=true 7 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文件
1 [program:redis] 2 directory=/usr/local/src/redis-2.6.16 3 command=/usr/local/src/redis-2.6.16/src/redis-server redis.conf 4 5 stdout_logfile=/tmp/redis_access.log 6 stderr_logfile=/tmp/redis_error.log 7 autostart=true 8 autorestart=true 9 startsecs=10 10 11 ; Need to wait for currently executing tasks to finish at shutdown. 12 ; Increase this if you have very long running tasks. 13 stopwaitsecs = 600 14 15 ; if rabbitmq is supervised, set its priority higher 16 ; so it starts first 17 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文件:
1 worker_processes 2; 2 daemon off; 3 events { 4 #use epoll; 5 worker_connections 1024; 6 } 7 http{ 8 #gzip on; 9 #gzip_min_length 100; 10 #gzip_buffers 4 16k; 11 #gzip_http_version 1.0; 12 #gzip_comp_level 2; 13 #gzip_types text/plain application/x-javascript text/css application/xml; 14 #gzip_vary on; 15 16 upstream 192.168.56.11 { 17 #这里指定多个源服务器,ip:端口,80端口的话可写可不写 18 server 127.0.0.1:8003; 19 server 127.0.0.1:8004; 20 server 127.0.0.1:8005; 21 server 127.0.0.1:8006; 22 23 } 24 server { 25 listen 8010; 26 location / { 27 #rewrite ^/smmp/servletsendmoremsg.do$ /send last; 28 proxy_redirect off; 29 proxy_set_header Host $host; 30 proxy_set_header X-Forwarded-For $remote_addr; 31 proxy_pass http://192.168.56.11; 32 33 } 34 35 } 36 37 # server { 38 # listen 443; 39 # ssl on; 40 # ssl_certificate server.crt; 41 # ssl_certificate_key server.key; 42 # 43 # ssl_session_timeout 5m; 44 # 45 # ssl_protocols SSLv2 SSLv3 TLSv1; 46 # ssl_ciphers HIGH:!aNULL:!MD5; 47 # ssl_prefer_server_ciphers on; 48 # location / { 49 # proxy_redirect off; 50 # proxy_set_header Host $host; 51 # proxy_set_header X-Forwarded-For $remote_addr; 52 # proxy_pass http://192.168.56.11; 53 # 54 # } 55 # 56 # } 57 }
在/etc/supervisord.conf.d/目录下生成nginx.conf文件
1 [program:nginx] 2 command=/usr/local/nginx/sbin/nginx 3 4 stdout_logfile=/tmp/nginx.log 5 stderr_logfile=/tmp/nginx.log 6 autostart=true 7 autorestart=true 8 startsecs=10 9 10 ; Need to wait for currently executing tasks to finish at shutdown. 11 ; Increase this if you have very long running tasks. 12 stopwaitsecs = 600 13 14 ; if rabbitmq is supervised, set its priority higher 15 ; so it starts first 16 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的路径:
1 ; ============================ 2 ; celeryd supervisor example 3 ; ============================ 4 5 ; NOTE: If you're using Django, you shouldn't use this file. 6 ; Use 7 ; http://github.com/celery/django-celery/tree/master/extra/supervisord/celeryd.conf 8 ; instead! 9 10 [program:celery] 11 command=/usr/local/bin/celery worker --loglevel INFO --queues=low_send_task_queue,high_send_task_queue 12 13 process_name = %(program_name)s-%(process_num)d 14 15 ; Set PYTHONPATH to the directory containing celeryconfig.py 16 environment=PYTHONPATH=/usr/local/workspace_eclipse3.7.2/venus 17 18 directory=/usr/local/workspace_eclipse3.7.2/venus 19 20 numprocs=2 21 stdout_logfile=/tmp/celery_sendsms_access.log 22 stderr_logfile=/tmp/celery_sendsms_error.log 23 autostart=true 24 autorestart=true 25 startsecs=10 26 27 ; Need to wait for currently executing tasks to finish at shutdown. 28 ; Increase this if you have very long running tasks. 29 stopwaitsecs = 600 30 31 ; if rabbitmq is supervised, set its priority higher 32 ; so it starts first 33 priority=998
7.5.用supervisord管理celery服务(django环境下):
在/etc/supervisord.conf.d/目录下生成celeryd_worker.conf文件
1 ; ============================================== 2 ; celery worker supervisor example for Django 3 ; ============================================== 4 5 [program:celeryworker] 6 command=/usr/local/bin/python manage.py celery worker --loglevel=INFO --queues=db_write_back_queue 7 directory=/usr/local/workspace_eclipse3.7.2/sms_web 8 9 numprocs=1 10 stdout_logfile=/tmp/celeryworker.log 11 stderr_logfile=/tmp/celeryworker.log 12 autostart=true 13 autorestart=true 14 startsecs=10 15 16 ; Need to wait for currently executing tasks to finish at shutdown. 17 ; Increase this if you have very long running tasks. 18 stopwaitsecs = 600 19 20 ; if rabbitmq is supervised, set its priority higher 21 ; so it starts first 22 priority=15 23 24 ;process_name = %(program_name)s-%(process_num)d 25 ;numprocs=2
在/etc/supervisord.conf.d/目录下生成celeryd_beat.conf文件,django环境下的心跳服务
1 ; ============================================== 2 ; celery worker supervisor example for Django 3 ; ============================================== 4 5 [program:celerybeat] 6 command=/usr/local/bin/python manage.py celery beat -s /var/log/sms_web/celerybeat-schedule --loglevel=INFO 7 directory=/usr/local/workspace_eclipse3.7.2/sms_web 8 9 numprocs=1 10 stdout_logfile=/tmp/celerybeat.log 11 stderr_logfile=/tmp/celerybeat.log 12 autostart=true 13 autorestart=true 14 startsecs=10 15 16 ; Need to wait for currently executing tasks to finish at shutdown. 17 ; Increase this if you have very long running tasks. 18 stopwaitsecs = 600 19 20 ; if rabbitmq is supervised, set its priority higher 21 ; so it starts first 22 priority=14 23 24 ;process_name = %(program_name)s-%(process_num)d 25 ;numprocs=2
7.6.用supervisord管理venus服务(启了四个进程):
在/etc/supervisord.conf.d/目录下生成venux.conf文件
1 [program:venus-8003] 2 directory=/usr/local/workspace_eclipse3.7.2/venus 3 command=/usr/local/bin/python main.py --port=8003 4 stdout_logfile=/tmp/venus_8003.log 5 stderr_logfile=/tmp/venus_8003.log 6 autostart=true 7 autorestart=true 8 priority=50 9 10 [program:venus-8004] 11 directory=/usr/local/workspace_eclipse3.7.2/venus 12 command=/usr/local/bin/python main.py --port=8004 13 stdout_logfile=/tmp/venus_8004.log 14 stderr_logfile=/tmp/venus_8004.log 15 autostart=true 16 autorestart=true 17 priority=51 18 19 [program:venus-8005] 20 directory=/usr/local/workspace_eclipse3.7.2/venus 21 command=/usr/local/bin/python main.py --port=8005 22 stdout_logfile=/tmp/venus_8005.log 23 stderr_logfile=/tmp/venus_8005.log 24 autostart=true 25 autorestart=true 26 priority=52 27 28 [program:venus-8006] 29 directory=/usr/local/workspace_eclipse3.7.2/venus 30 command=/usr/local/bin/python main.py --port=8006 31 stdout_logfile=/tmp/venus_8006.log 32 stderr_logfile=/tmp/venus_8006.log 33 autostart=true 34 autorestart=true 35 priority=53 36 ~
7.7.用supervisord管理接收短信的服务:
在/etc/supervisord.conf.d/目录下生成receiver_cmpp.conf文件
1 [program:receiver-cmpp] 2 directory=/usr/local/workspace_eclipse3.7.2/sms_tool 3 command=/usr/local/bin/python receiver_cmpp.py 4 5 stdout_logfile=/tmp/receiver_cmpp.log 6 stderr_logfile=/tmp/receiver_cmpp.log 7 autostart=true 8 autorestart=true 9 startsecs=10 10 11 ; Need to wait for currently executing tasks to finish at shutdown. 12 ; Increase this if you have very long running tasks. 13 stopwaitsecs = 600 14 15 ; if rabbitmq is supervised, set its priority higher 16 ; so it starts first 17 priority=21
在/etc/supervisord.conf.d/目录下添加新的配置文件后,执行命令:
1 supervisorctl update
就会把新添加的服务启动起来,且不会影响正在运行的 服务。