supervisor使用相关问题

supervisor使用相关问题

简介

Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启

常见问题

使用supervisor添加子配置文件时, 执行以下命令

1
supervisorctl reread

后提示No config updates to processes

产生原因可能如下

  • 配置文件没写对, 导致运行不起来
  • centos路径没引用对

解决办法

1.正确路径

通常我们加载子配置文件是会将配置文件supervisord.conf的最后一部分修改为

1
2
[include]
files=/root/supervisor/conf.d/*.ini

这里有几个细节(都是我遇到过的并且踩坑了的)

  1. files后面最好不要加空格, 例如files = /root/supervisor/conf.d/*.ini 这种有可能会找不着路径

  2. 有的如果是*.conf 结尾的可能也用不起, 最好还是改成 ini 结尾的

  3. 最开始这部分是注释着的, 最后取消注释的时候记得把[include] 这个也取消注释了,这也是我踩过的坑:sweat:

2.正确配置文件

关于配置文件的修改可以参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[program:test]
command=sh /root/supervisord/test.sh
priority=999 ; 相对启动优先级,数值越小越优先,默认为999
autostart=true ; 在supervisor启动时自动启动,默认为true
autorestart=true ; 在意外退出时重新启动,默认为true
startsecs=10 ; 子进程启动多少秒后状态为running则认为启动成功,默认为1
startretries=3 ; 尝试启动的最大次数,默认为3
exitcodes=0,2 ; 进程的预期退出代码列表,默认为0
stopsignal=QUIT ; 终止进程的信号,默认为TERM
stopwaitsecs=10 ; 在SIGKILL之前等待的最大秒数,默认为10
user=root ; 在某用户下设置uid来启动程序,默认不切换用户
redirect_stderr=true ; 是否重定向stdout和stderr,默认为false
stdout_logfile=/tmp/supervisor.stdout.log ; stdout的输出文件,默认为AUTO
stdout_logfile_maxbytes=50MB ; stdout最大文件大小,默认为50MB
stdout_logfile_backups=10 ; stdout文件备份数,设为0则不备份,默认为10

其实只需要配置3个参数,其它不用管:

  • command=sh /root/supervisord/test.sh: 我们的子进程启动命令;
  • stdout_logfile=/tmp/supervisor.stdout.log: 日志;
  • program:test:进程名为test,如果进程哪一天想停止启动等,需要进程名;

最后

修改完后再次输入supervisorctl reread 应该就会获取到子进程配置文件并且启动进程了

再不行就输入一下 supervisorctl reload (重启 supervisord), supervisorctl update (改动某配置文件,重新加载)什么的就大功告成啦:ok_hand:

附录

supervisorctl 常用命令

新增某配置文件,重新加载

1
supervisorctl reread

改动某配置文件,重新加载

1
supervisorctl update

重启 supervisord

1
supervisorctl reload

查看所有进程状态

1
supervisorctl status

查看指定进程状态

1
supervisorctl status <name>

启动所有子进程

1
supervisorctl start all

启动指定子进程

1
supervisorctl start <name>

重启所有子进程

1
supervisorctl restart all

重启指定子进程

1
supervisorctl restart <name>

停止所有子进程

1
supervisorctl stop all

停止指定子进程

1
supervisorctl stop <name>

添加子进程到进程组

1
supervisorctl add <name>

从进程组移除子进程,需要先stop。注意:移除后,需要使用reread和update才能重新运行该进程

1
supervisorctl reomve <name