supervisord 是一个用 Python 写的进程管理工具,是类Unix系统中的一个进程管理工具,
Supervisor
只适用于类Unix 系统,不适用于Window。
安装 因为Supervisor
是用 Python
所写的,所以可以直接使用pip
安装:
1 sudo pip install supervisor
Ubuntu:
1 apt-get install supervisor
Mac:
配置 Supervisor
运行时会启动一个进程——supervisord
。
supervisord
:它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。
supervisorctl
:是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。
查看默认配置项
将默认配置项重定向至配置文件:
1 $ echo_supervisord_conf > /etc/supervisord.conf
然后可以看到 /etc/
配置文件下出现了以下文件,其中/etc/supervisor
是我们需要的配置文件。
1 2 3 4 $ find /etc/ -name supervisor /etc/default/supervisor /etc/init.d/supervisor /etc/supervisor
/etc/supervisord.conf
核心配置文件,参考以下部分配置,;
表示注释。
因为Supervisor
默认配置会把socket文件和pid守护进程生成在/tmp/目录下,/tmp/目录是缓存目录,所以我们需要手动换成/var/run
目录。
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 [unix_http_server] ;file=/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用 file=/var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除 ;chmod=0700 ; socket 文件的 mode,默认是 0700 ;chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid ;[inet_http_server] ; HTTP 服务器,提供 web 管理界面 ;port=127.0.0.1:9001 ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性 ;username=user ; 登录管理后台的用户名 ;password=123 ; 登录管理后台的密码 [supervisord] ;logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log logfile=/var/log/supervisor/supervisord.log ; 修改为 /var/log 目录,避免被系统删除 logfile_maxbytes=50MB ; 日志文件大小,超出会 rotate,默认 50MB logfile_backups=10 ; 日志文件保留备份数量默认 10 loglevel=info ; 日志级别,默认 info,其它: debug,warn,trace ;pidfile=/tmp/supervisord.pid ; pid 文件 pidfile=/var/run/supervisord.pid ; 修改为 /var/run 目录,避免被系统删除 nodaemon=false ; 是否在前台启动,默认是 false,即以 daemon 的方式启动 minfds=1024 ; 可以打开的文件描述符的最小值,默认 1024 minprocs=200 ; 可以打开的进程数的最小值,默认 200 ; 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 ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致 serverurl=unix:///var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除 ;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord ; 包含其他的配置文件 [include] files = relative/directory/*.ini ; 可以是 *.conf 或 *.ini
/etc/supervisor/conf.d
则是用来配置管理进程的配置文件,所有需要被supervisor
管理的进程都需要在这里先配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [program:demo] command=php demo.php // 需要执行队列的名称 directory= /var/www // 命令执行的目录或者说执行 command 之前,先切换到工作目录 可以理解为在执行命令前会切换到这个目录 process_name=%(process_num)02d // 默认为 %(program_name)s,即 [program:x] 中的 x这个是进程名,如果下面的numprocs参数为1的话,就不用管这个参数了,它默认值%(program_name)s也就是上面的那个program冒号后面的 numprocs=1 // 进程数量当不为1时的时候,就是进程池的概念,注意process_name的设置 autostart=true // 是否自动启动 autorestart=true // 程序意外退出是否自动重启 startsecs=1 // 自动重启间隔 startretries=20 // 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把此进程的状态置为FAIL 默认值为3 redirect_stderr=true // 如果为true,则stderr的日志会被写入stdout日志文件中 理解为重定向输出的日志 user=root // 这个参数可以设置一个非root用户,当我们以root用户启动supervisord之后。我这里面设置的这个用户,也可以对supervisord进行管理 stopsignal=INT stderr_logfile=/var/log/supervisor/demo.err.log // 子进程的stdout的日志路径 输出日志文件 stdout_logfile=/var/log/supervisor/demo.out.log // 错误日志文件 当redirect_stderr=true。这个就不用
启动 1 $ supervisord -c /etc/supervisord.conf
常用命令整理 停止进程,program_name 为 [program:x] 里的 x
1 supervisorctl stop program_name
启动进程
1 supervisorctl start program_name
重启进程
1 supervisorctl restart program_name
结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
1 supervisorctl stop groupworker:
结束 groupworker:name1 这个进程 (start,restart 同理)
1 supervisorctl stop groupworker:name1
停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
常见问题 unlinking stale socket /var/run/supervisor.sock 1 2 3 4 $ find / -name supervisor.sock /run/supervisor.sock $ unlink /run/supervisor.sock
参考链接