1 安装

apt-get install supervisor

2 简介

2.1 supservisor自身提供三个命令:

2.1.1 supervisorctl

supervisorctl:类似systemctl,用于管理进程,如启动、停止、重启

supervisorctl status查看应用名称【programeName 】及其运行状态
/etc/init.d/supervisor restart重启supervisor ,网上说可以重新加载配置问文件,亲测无效
systemctl stop supervisor停止supervisor
supervisorctl stop [programName]停止指定应用
supervisorctl start [programName]启动指定应用
supervisorctl restart [programName]重启指定应用
supervisorctl stop all停止所有应用
supervisorctl reload载入最新的配置文件,重启所有进程
supervisorctl update根据最新的配置,重启配置更改过的进程,未更新的进程不受影响

2.1.2 supervisord

supervisord:加载配置文件,一个配置文件一个子进程。当挂载的子进程出现奔溃时会自动重启
下面这条命令会加载supervisord.conf文件(主配置文件),此时supervisor如果是停止状态,会自动启动

supervisord -c /etc/supervisor/supervisord.conf

增加-n参数,可以实时查看启动时的日志输出,使用ctrl+c退出(退出不影响进程)

supervisord -n -c /etc/supervisor/supervisord.conf

2.1.3 echo_supervisord_conf

echo_supervisord_conf : 输出自带的配置文件内容。一般用于配合以下命令生成配置文件。

echo_supervisord_conf > xxx.conf

2.2 配置文件

/etc/supervisor/supervisor.conf 主配置文件。
一般用于配置supservisor的通用参数,如指定自动加载的目录,设置http服务地址等。
/etc/supervisor/conf.d自定义的进程管理文件存放目录。
主要添加进程名、进程组、进程的启动命令、进程的log日志路径等参数。

2.3 重要事项

● supervisor 不支持监听后台启动的进程。所有在配置文件中添加启动命令的时候,不要添加后台启动部分的命令。
● 修改完配置文件,需要手动重启supervisor才能生效(或者重新加载、更新都行)

2.4 查看supervisor的log日志

这个日志文件是查看supservisor自身的日志,其管理的进程输出的日志在配置文件中声明。
sudo cat /var/log/supervisor/supervisord.log

3 配置

3.1 修改配置文件

  1. 备份默认的配置文件
    cp /etc/supervisor/supervisord.conf /etc/supervisor/supervisord.conf_bak
    
  2. 重新生成配置文件
    echo_supervisord_conf > supervisord.conf
    
  3. vim编辑器打开配置文件
    vim /etc/supervisor/supervisord.conf
    
  4. 修改参数,主要内容如下。
    修改时一定要注意路径,默认的是/temp,需要改成/var/run/
    [unix_http_server]
    file=/var/run/supervisor.sock   ; (the path to the socket file)
    
    [inet_http_server]         ; inet (TCP) server disabled by default
    port=*:9001        ; (ip_address:port specifier, *:port for all iface)
    
    [supervisord]
    logfile=/var/log/supervisor/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=/var/run/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)
    childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
    
    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
    
    [supervisorctl]
    serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket
    
    [include]
    files = /etc/supervisor/conf.d/*.conf
    
  5. 创建一个应用配置文件a.conf,然后进行编辑
    vim /etc/supervisor/conf.d/a.conf
    
    参考内容如下,移动要注意command参数不能使用后台启动命令,不然supervisor监听不了
    [group:tornados]#创建一个应用组
    programs=dtaa,iothttp_zhonghe#应用组中的程序名
    stopasgroup=true
    
    [program:dtaa]#dtaa应用程序启动参数
    command=/opt/dtaa/venv/bin/python /opt/dtaa/app.py#解释器要用绝对路径,后进默认在directory变量指定的目录中
    directory=/opt/dtaa#应用路径
    user=root
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/opt/dtaa/log.out
    loglvel=info
    
    [program:iothttp_zhonghe]#第二个应用程序的启动参数
    command=/opt/iothttp/venv/bin/python app.py --c=config_zhonghe --s=main_zhonghe#解释器要用绝对路径,后进默认在directory变量指定的目录中
    directory=/opt/iothttp
    user=root
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/opt/iothttp/log_zhonghe.out
    loglvel=info
    

3.2 加载配置文件

  1. 加载主配置文件,应用配置文件会跟随启动
    supervisord -c /etc/supervisor/supervisord.conf
    
    如果已经加载过,只要使用update或reload方法
    supervisorctl update
    
  2. 查看启动状态
    supervisorctl  status
    
    结果如下,第一列就是应用名称拉
    tornados:dtaa                    RUNNING   pid 21580, uptime 1:17:37
    tornados:iothttp_zhonghe         RUNNING   pid 18731, uptime 1:19:42
    

3.3 访问网页版管理页面

尝试访问配置文件中的9001端口,这样管理起来就很方便了。
在这里插入图片描述

4 常见报错问题

4.1 报错 unix:///var/run/supervisor.sock no such file

  • 方案1:
    (1)先停止supervisor
    systemctl sotp supervisor.service
    
    (2)然后查看是否有supervisord进程没有结束
    ps ax |grep supervisor
    
    如果有进程没结束就手动杀死
    kill -9 [pid]
    
    (3)使用以下命令,重新加载配置文件。整个服务会自动启动
    supervisord -c /etc/supervisor/supervisord.conf
    #或
    /usr/bin/python2 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
    
  • 方案2:
    (1)问题原因是文件被系统删除,可以手动创建sock文件。然后重新加载配置
    sudo touch /var/run/supervisor.sock
    sudo chmod 777 /var/run/supervisor.sock
    supervisord -c /etc/supervisor/supervisord.conf
    
    (2)然后查看supervisord的进程,如果有重复进程需要进行查杀,否则cpu占用率可能会比较高。
    ps ax |grep supervisor
    #如果有多余进程没结束就手动杀死
    kill -9 [pid]
    

4.2 报错 Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord

(1)尝试关闭配置文件中包含的所有服务

supervisorctl status
supervisorctl stop [programName]

(2)如果关闭不掉,试用命令ps ax |grep supervisor 查看pid,杀掉所有查看到的进程。

ps ax |grep supervisor
kill -9 [pid]

(3)如果还是报错,取消socket的软连接。注意,下方的路径是在supervisord.conf中声明的。

unlink /var/run/supervisor.sock
unlink /tmp/supervisor.sock 
supervisord -c /etc/supervisor/supervisord.conf

4.3 cpu占用率过高的问题

(1) 使用以下命令查看是否有重复启动的配置文件

ps -ax |grep supervisor

(2) 使用kill命令杀掉多余的进程,只保留以一个

ps ax |grep supervisor
#如果有多余进程没结束就手动杀死
kill -9 [pid]

(3) 如果还是占用率过高,使用以下命令编辑配置文件,把http服务注释掉

vim /etc/supervisor/supervisor.conf

4.4 报错 [line 57]: ‘json module not found, using jsonujson module not found, using jsonujson module not found, using json\n’

此问题不是json模块找不到,是配置文件格式不对,仔细检查或重写配置文件就能搞定。


end~! 欢迎点赞、收藏、转发和评论

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐