Supervisor简单介绍 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序。supervisor与launchd,daemontools,runit等程序有着相同的功能,与其中某些程序不同的是,它并不作为“id 为 1的进程”而替代init。相反,它用于控制应用程序,像启动其它程序一样,通俗理解就是,把Supervisor服务管理的进程程序,它们作为supervisor的子进程来运行,而supervisor是父进程。supervisor来监控管理子进程的启动关闭和异常退出后的自动启动。
至于为什么要用supervisor来管理进程,是因为相对于linux传统的进程管理(即系统自带的init 进程管理)方式来说,它有很多的优势:
简单方便 通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下面。其实这么做有很多不好的地方:
a) 编写这个脚本,耗时耗力。
b) 当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,还要自己另外写一个监控重启脚本。
supervisor则可以完美的解决上面这那两个问题! 那么supervisor怎么解决呢?
a) supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了自己写脚本管理linux进程的麻烦了。
b) 被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以也就可以对挂掉的子进程进行自动重启了, 至于重启还是不重启,也要看配置文件里面有没有设置autostart=true。
精确 linux对进程状态的反馈有时候不太准确, 也就是说linux进程通常很难获得准确的up/down状态, Pidfiles经常说谎! 而supervisor监控子进程,得到的子进程状态无疑是准确的。supervisord将进程作为子进程启动,所以它总是知道其子进程的正确的up/down状态,可以方便的对这些数据进行查询.
进程分组 进程支持分组启动和停止,也支持启动顺序,即‘优先级’,supervisor允许为进程分配优先级,并允许用户通过supervisorctl客户端发出命令,如“全部启动”和”重新启动所有“,它们以预先分配的优先级顺序启动。还可以将进程分为”进程组“ ,一组逻辑关联的进程可以作为一个单元停止或启动。进程组supervisor可以对进程组统一管理,也就是说我们可以把需要管理的进程写到一个组里面,然后把这个组作为一个对象进行管理,如启动,停止,重启等等操作。而linux系统则是没有这种功能的,想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。
集中式管理 supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了。管理supervisor时, 可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,可以在web界面上监控,管理进程。 当然了,本地,远程和web管理的时候,需要调用supervisor的xml_rpc接口。
可扩展性 supervisor有一个简单的事件(event)通知协议,还有一个用于控制的XML-RPC接口,可以用Python开发人员来扩展构建。
权限 总所周知, linux的进程特别是侦听在1024端口之下的进程,一般用户大多数情况下,是不能对其进行控制的。想要控制的话,必须要有root权限。然而supervisor提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程了。
兼容性,稳定性 supervisor由Python编写,在除Windows操作系统以外基本都支持,如linux,Mac OS x,solaris,FreeBSD系统。
Supervisor组成部分 supervisord: 服务守护进程 supervisor服务器的进程名是supervisord。它主要负责在自己的调用中启动子程序,响应客户端的命令,重新启动崩溃或退出的进程,记录其子进程stdout和stderr的输出,以及生成和处理对应于子进程生命周期中的”event”服务器进程使用的配置文件,通常路径存放在/etc/supervisord.confa中。此配置文件是INI格式的配置文件。
supervisorctl:命令行客户端 supervisor命令行的客户端名称是supervisorctl。它为supervisord提供了一个类似于shell的交互界面。使用supervisorctl,用户可以查看不同的supervisord进程列表,获取控制子进程的状态,如停止和启动子进程
Web Server:提供与supervisorctl功能相当的WEB操作界面 一个可以通过Web界面来查看和控制进程的状态,默认监听在9091上。
XML-RPC Interface:XML-RPC接口 supervisor用于控制的XML-RPC接口
Supervisor安装 (YUM安装) centos系统下可以直接yum安装, 前提是需要下载epel源, 下载地址: http://dl.fedoraproject.org/pub/epel/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ==================centos6版本系统================== [root@localhost ~] [root@localhost ~] 开机启动 [root@localhost ~] 启动/关闭/重启等操作 [root@localhost ~] ==================centos7版本系统================== [root@localhost ~] or [root@localhost ~] [root@localhost ~] 开机启动 [root@localhost ~] 启动/关闭/重启等操作 [root@localhost ~]
特别注意另一种安装方式 : 除了 yum 安装方式以外, 我们通过会选用 pip 或 easy_install 方式安装 supervisor。 但是 supervisor 目前只有 python2 支持的版本, 目前不支持python3。
1 2 3 [root@localhost ~] [root@localhost ~]
配置及启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 [root@localhost ~] [root@localhost ~] [root@localhost ~] root 26586 1 0 02:02 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 26588 26184 0 02:02 pts/0 00:00:00 grep --color=auto /etc/supervisord [root@localhost ~] /usr/bin/supervisord [root@localhost ~] /usr/bin/supervisorctl [root@localhost ~] [Unit] Description=Process Monitoring and Control Daemon After=rc-local.service nss-user-lookup.target [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf ExecReload=/usr/bin/supervisorctl reload ExecStop=/usr/bin/supervisorctl shutdown [Install] WantedBy=multi-user.target [root@localhost ~] [root@localhost ~] root 26586 1 0 02:02 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 26933 26184 0 02:08 pts/0 00:00:00 grep --color=auto /etc/supervisord [root@localhost ~] Shut down [root@localhost ~] root 26940 26184 0 02:08 pts/0 00:00:00 grep --color=auto /etc/supervisord [root@localhost ~] [root@localhost ~] root 27049 1 0 02:09 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 27052 26184 0 02:09 pts/0 00:00:00 grep --color=auto /etc/supervisord [root@localhost ~] [root@localhost ~] root 27068 26184 0 02:09 pts/0 00:00:00 grep --color=auto /etc/supervisord [root@localhost ~] [root@localhost ~] [root@localhost ~] [root@localhost ~] root 27097 1 0 02:09 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 27100 26184 0 02:09 pts/0 00:00:00 grep --color=auto /etc/supervisord [root@localhost ~] Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [root@localhost ~] ....... ;[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=192.168.10.10: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) [program:nginx] command =/usr/local/nginx/sbin/nginxprocess_name=nginx autostart=true autorestart=true [root@localhost ~] [root@localhost ~]
supervisor监控管理 web界面管理 为了更方便的远程管理 Supervisor ,我们还可以开启其自带的 web 控制台。打开 /etc/supervisord.conf ,在文件末尾增加以下内容:
1 2 3 4 5 6 7 8 9 10 11 [root@kevin ~] ...... [inet_http_server] port=*:5000 username=user password=123456 配置说明: port 为监听端口,username 和 password 分别为帐号和密码。 保存文件后需要重启supervisor 然后访问"http://ip:5000" , 输入上面设置的用户名和密码即可打开supervisor的web 控制台了。
客户端命令行操作
通过shell来管理supervisor ,可以使用以下命令: 1 2 3 4 5 6 supervisorctl start appname supervisorctl stop appname supervisorctl restart appname supervisorctl start all supervisorctl stop all supervisorctl restart all
最后需要注意的是:
如果使用 Supervisor 监控 shell 脚本,不能在脚本中完全使用 nohup, setsid 等后台运行命令,否则 supervisor 会误认为程序自动退出而不断重启脚本。
Supervisord 安装完成后有两个可用的命令行: supervisor 和 supervisorctl
常见的命令如下:
1 2 3 4 5 6 7 8 supervisord supervisorctl stop programxxx supervisorctl start programxxx supervisorctl restart programxxx supervisorctl stop groupworker supervisorctl stop all supervisorctl reload supervisorctl update
常见命令
1 2 supervisorctl tail programname supervisorctl tail redis
supervisor事件监听及通知机制
supervisor 向 listeners 发送和子进程或自身有关的 notification 。对于同一pool内的 listeners,supervisor 会选取任一可用的进行通知。
配置被监控进程 [program:x] 的日志 Capture Mode,被监控进程可向stdout输出业务数据,由 supervisod 捕获这些数据,发给listener。
配置 event-listener:监听 PROCESS_COMMUNICATION_STDOUT 事件
envent-listener 模块开发:使用 python 的 supervisor.childutils 模块。该模块可作为监控代理模块,和进程及网管服务通信。与网管服务可采用 redis 的 list 实现。
使用 supervisorctl 管理进程
停止某一个进程,program_name 为 [program:x] 里的 x:
1 supervisorctl stop program_name
1 supervisorctl start program_name
1 supervisorctl restart program_name
停止全部进程,注:start、restart、stop 都不会载入最新的配置文件:
载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程:
根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启:
Supervisor配置文件说明 [program:x]中配置要监控的进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 [unix_http_server] file =/tmp/supervisor.sock 的。如果不设置的话,supervisorctl也就不能用了 不设置的话,默认为none。 非必须设置 不设置的话,默认为0700。 非必须设置 不设置的话,默认为启动supervisord进程的用户及属组。非必须设置 不设置的话,默认为不需要用户。 非必须设置 如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d 默认不设置。。。非必须设置 不设置的话,默认为不开启。非必须设置 这个必须设置,只要上面的[inet_http_server] 开启了,就必须设置它 [supervisord] 这个必须设置,不设置,supervisor就不用干活了 logfile =/tmp/supervisord.log 默认路径$CWD/supervisord.log,$CWD是当前目录。。非必须设置 logfile_maxbytes =50 MB 志文件。当设置为0时,表示不限制文件大小 默认值是50M,非必须设置。 logfile_backups =10 数量大于10时,最初的老文件被新文件覆盖,文件数量将保持为10 当设置为0时,表示不限制文件的数量。 默认情况下为10。。。非必须设置 loglevel =info 默认为info。。。非必须设置项 pidfile =/tmp/supervisord.pid 默认为$CWD/supervisord.pid。。。非必须设置 nodaemon =false 默认为false,也就是后台以守护进程运行。。。非必须设置 minfds =1024 系统的文件描述符在这里设置cat /proc/sys/fs/file-max 默认情况下为1024。。。非必须设置 minprocs =200 ulimit -u这个命令,可以查看linux下面用户的最大进程数 默认为200。。。非必须设置 默认为022。。非必须设置项 我这里面设置的这个用户,也可以对supervisord进行管理 默认情况是不设置。。。非必须设置项 supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个 supervisor设置不同的标识符了 默认是supervisord。。。非必需设置 supervisord进程之前,会先切换到这个目录 默认不设置。。。非必须设置 产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当 然不想日志被清除了。所以可以设置为true 默认是false,有调试需求的同学可以设置为true。。。非必须设置 默认路径是这个东西,执行下面的这个命令看看就OK了,处理的东西就默认路径 python -c "import tempfile 非必须设置 环境变量,在这里可以设置supervisord进程特有的其他环境变量。 supervisord启动子进程时,子进程会拷贝父进程的内存空间内容。 所以设置的 这些环境变量也会被子进程继承。 小例子:environment =name="haha" ,age="hehe" 默认为不设置。。。非必须设置 序列呢?就是我们的\n,\t这些东西。 默认为false。。。非必须设置 [rpcinterface:supervisor] 个选项必须要开启的 supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl =unix:///tmp/supervisor.sock 路径,注意这个是和前面的[unix_http_server] 对应的 默认值就是unix:///tmp/supervisor.sock。。非必须设置 注意这个和前面的[inet_http_server] 对应 默认就是http://127.0.0.1:9001。。。非必须项 默认空。。非必须设置 默认空。。非必须设置 默认supervisor。。非必须设置 默认是no file的。。所以我们想要有这种功能,必须指定一个文件。。。非 必须设置 有点关联最好。这样的program我们可以设置一个或多个,一个program就是 要被管理的一个进程 例子:/home/test.py -a 'hehe' 有一点需要注意的是,我们的command只能是那种在终端运行的进程,不能是 守护进程。这个想想也知道了,比如说command =service httpd start。 httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令 这已经不是严格意义的子进程了。 这个是个必须设置的项 了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字, 但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个 进程都用同一个进程名吧。 默认为1 。。非必须设置 默认不设置。。。非必须设置 默认值为999 。。非必须设置 默认就是true 。。非必须设置 和true。如果为false的时候,无论什么情况下,都不会被重新启动, 如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退 出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无 条件的重启 动成功了 默认值为1 。。非必须设置 此进程的状态置为FAIL 默认值为3 。。非必须设置 退出码是expected的。 默认为TERM 。。当用设定的信号去干掉进程,退出码会被认为是expected 非必须设置 给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该 子进程发送一个强制kill的信号。 默认为10秒。。非必须设置 子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程 有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的 整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。 需要注意的是,该选项发送的是stop信号 默认为false。。非必须设置。。 管理该program 默认不设置。。。非必须设置项 默认为false,非必须设置 设置为none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方 生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被 清空。当 redirect_stderr =true 的时候,sterr也会写进这个日志文件 发送信息,而supervisor可以根据信息,发送相应的event。 默认为0,为0的时候表达关闭管道。。。非必须项 触发supervisord发送PROCESS_LOG_STDOUT类型的event 默认为false。。。非必须设置 设置了,设置了也是白搭。因为它会被写入stdout_logfile的同一个文件中 默认为AUTO,也就是随便找个地存,supervisord重启被清空。。非必须设置 程,不过它干的活是订阅supervisord发送的event。他的名字就叫 listener了。我们可以在listener里面做一系列处理,比如报警等等 楼主这两天干的活,就是弄的这玩意 OK了 超过10的时候,最旧的event将会被清除,并把新的event放进去。 默认值为10。。非必须选项 默认为不切换。。。非必须 unexpected和exitcodes的关系 那么会被认为是正常维护,退出码也被认为是expected中的 默认为空。。非必须设置 默认为false。。。非必须设置 默认为空。。。非必须设置 我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,就相当于原来 的配置从supervisor的配置文件里消失了。。。supervisor只会对组进行管理,而不再 会对组里面的单个program进行管理了 这个是个必须的设置项 默认999。。非必须选项 就有点大了。我们可以把配置信息写到多个文件中,然后include过来
样例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [supervisord] http_port =/var/tmp/supervisor.sock logfile =/var/log/supervisor/supervisord.log logfile_maxbytes =50 MB logfile_backups =10 loglevel =info pidfile =/var/run/supervisord.pid nodaemon =false minfds =1024 minprocs =200 [supervisorctl] serverurl =unix:///var/tmp/supervisor.sock
“;”为注释。各参数的含义都很明确。可以根据官方手册结合实验来进一步深入了解。重点说几个[program:example]中的参数
下面是一个使用supervisor监控的配置情况(配置中的其他默认内容在此省略)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [program:worker_for_summary] command =/home/op1/scripts/rabbitmqclient/worker_for_summary.pypriority =1 log_stderr =true [program:worker_for_detail_all] command =/home/op1/scripts/rabbitmqclient/worker_for_detail_all.pypriority =1 log_stderr =true [program:worker_for_detail_recent_list] command =/home/op1/scripts/rabbitmqclient/worker_for_detail_recent_list.pypriority =1 log_stderr =true [program:worker_for_detail_recent_sset] command =/home/op1/scripts/rabbitmqclient/worker_for_detail_recent_sset.pypriority =1 log_stderr =true [program:publisher_for_summary] command =/home/op1/scripts/rabbitmqclient/publisher_for_summary.pypriority =999 log_stderr =true [program:publisher_for_summary_nt] command =/home/op1/scripts/rabbitmqclient/publisher_for_summary_nt.pypriority =999 log_stderr =true [program:publisher_for_detail] command =/home/op1/scripts/rabbitmqclient/publisher_for_detail.pypriority =999 log_stderr =true [program:publisher_for_detail_nt] command =/home/op1/scripts/rabbitmqclient/publisher_for_detail_nt.pypriority =999 log_stderr =true
配置完成后启动supervisord
1 2 3 4 5 6 7 8 9 10 11 12 [root@op-zhongkong ~] 可以看到配置的各个进程在后台运行了起来。停掉某个进程后supervisor会马上自动重启该进程!!! [root@op-zhongkong ~] supervisor> status publisher_for_detail RUNNING pid 27557, uptime 0:00:45 publisher_for_detail_nt RUNNING pid 27567, uptime 0:00:45 publisher_for_summary RUNNING pid 27566, uptime 0:00:45 publisher_for_summary_nt RUNNING pid 27568, uptime 0:00:45 worker_for_detail_all RUNNING pid 27581, uptime 0:00:45 worker_for_detail_recent RUNNING pid 27582, uptime 0:00:45 worker_for_summary RUNNING pid 27559, uptime 0:00:45
停止supervisor
可通过help了解命令的更多用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 [root@op-zhongkong ~] supervisor> help Documented commands (type help <topic>): ======================================== EOF exit maintail quit restart start stop clear help open reload shutdown status tail supervisor> help stop stop <processname> Stop a process. stop <processname> <processname> Stop multiple processes stop all Stop all processes When all processes are stopped, they are stopped in reverse priority order (see config file) supervisor> help status status Get all process status info. status <name> Get status on a single process by name. status <name> <name> Get status on multiple named processes. supervisor> stop publisher_for_summary publisher_for_summary: stopped supervisor> status publisher_for_detail RUNNING pid 27557, uptime 0:05:41 publisher_for_detail_nt RUNNING pid 27567, uptime 0:05:41 publisher_for_summary STOPPED Feb 27 02:48 PM publisher_for_summary_nt RUNNING pid 27568, uptime 0:05:41 worker_for_detail_all RUNNING pid 27581, uptime 0:05:41 worker_for_detail_recent RUNNING pid 27582, uptime 0:05:41 worker_for_summary RUNNING pid 27559, uptime 0:05:41 supervisor> start publisher_for_summary publisher_for_summary: started supervisor> status publisher_for_detail RUNNING pid 27557, uptime 0:08:02 publisher_for_detail_nt RUNNING pid 27567, uptime 0:08:02 publisher_for_summary RUNNING pid 3035, uptime 0:00:04 publisher_for_summary_nt RUNNING pid 27568, uptime 0:08:02 worker_for_detail_all RUNNING pid 27581, uptime 0:08:02 worker_for_detail_recent RUNNING pid 27582, uptime 0:08:02 worker_for_summary RUNNING pid 27559, uptime 0:08:02 supervisor> stop all worker_for_detail_recent: stopped worker_for_detail_all: stopped publisher_for_summary_nt: stopped publisher_for_detail_nt: stopped publisher_for_summary: stopped worker_for_summary: stopped publisher_for_detail: stopped supervisor> status publisher_for_detail STOPPED Feb 27 02:51 PM publisher_for_detail_nt STOPPED Feb 27 02:51 PM publisher_for_summary STOPPED Feb 27 02:51 PM publisher_for_summary_nt STOPPED Feb 27 02:51 PM worker_for_detail_all STOPPED Feb 27 02:51 PM worker_for_detail_recent STOPPED Feb 27 02:51 PM worker_for_summary STOPPED Feb 27 02:51 PM supervisor> start all publisher_for_detail: started worker_for_summary: started publisher_for_summary: started publisher_for_detail_nt: started publisher_for_summary_nt: started worker_for_detail_all: started worker_for_detail_recent: started supervisor> status publisher_for_detail RUNNING pid 5111, uptime 0:00:15 publisher_for_detail_nt RUNNING pid 5141, uptime 0:00:15 publisher_for_summary RUNNING pid 5135, uptime 0:00:15 publisher_for_summary_nt RUNNING pid 5147, uptime 0:00:15 worker_for_detail_all RUNNING pid 5153, uptime 0:00:15 worker_for_detail_recent RUNNING pid 5159, uptime 0:00:14 worker_for_summary RUNNING pid 5112, uptime 0:00:15
分享一个线上曾经用过的supervisor监控python程序的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [program:xcspam] command =/usr/bin/python /app/web/xcspam/bin/main.py --port=93 %(process_num)02 dprocess_name =%(program_name)s_%(process_num)02 dnumprocs =16 numprocs_start =1 directory =/app/web/xcspamuser =workautostart =true autorestart =true stopsignal =QUITstdout_logfile =/data/log/xcspam/xcspam.logstderr_logfile =/data/log/xcspam/xcspam_error.logstdout_logfile_maxbytes =0 stderr_logfile_maxbytes =0 environment =PYTHONPATH=/app/web/xcspam, KEVIN_ENV=production [program:report] command =/usr/bin/celery -A worker worker -Q report --loglevel=INFOdirectory =/app/web/xcspam/binuser =workautostart =true autorestart =true stopsignal =QUITstdout_logfile =/data/log/xcspam/celery-report.logstderr_logfile =/data/log/xcspam/celery-report_error.logstdout_logfile_maxbytes =0 stderr_logfile_maxbytes =0 environment =PYTHONPATH=/app/web/xcspam, KEVIN_ENV=production [program:antiwater] command =/usr/bin/celery -A worker worker -Q antiwater --loglevel=INFOdirectory =/app/web/xcspam/binuser =workautostart =true autorestart =true stopsignal =QUITstdout_logfile =/data/log/xcspam/celery-antiwater.logstderr_logfile =/data/log/xcspam/celery-antiwater_error.logstdout_logfile_maxbytes =0 stderr_logfile_maxbytes =0 environment =PYTHONPATH=/app/web/xcspam, KEVIN_ENV=production [program:celery-flower] command =/usr/bin/celery flower -A worker --address=10.31 .51.232 --port=9330 directory =/app/web/xcspam/binuser =workautostart =true autorestart =true stopsignal =QUITstdout_logfile =/data/log/xcspam/celery-flower.logstderr_logfile =/data/log/xcspam/celery-flower_error.logstdout_logfile_maxbytes =0 stderr_logfile_maxbytes =0 environment =PYTHONPATH=/app/web/xcspam, KEVIN_ENV=production
其他配置查看 Supervisor (进程管理利器) 使用说明 - 运维笔记