Linux命令(3)supervisord
supervisord类似systemd,帮助用户管理应用程序,不需要再使用nohup这样的命令去启动并且托管。
同时supervisord还有系统保活、自动拉起等功能,如果因为意外操作系统重启或者进程遇到意外自动退出了,supervisord都会自动重新启动被管理的程序。
安装
Centos 7.9
1 | sudo yum install epel-release |
启动supervisor
1 | sudo systemctl enable supervisord # 开机自启动 |
对于Centos系统,主配置文件在/etc/supervisord.conf
,被管理的程序的配置文件放在/etc/supervisord.d
内。
1 | ls /etc/supervisord. |
打开/etc/supervisord.conf
配置文件,可以看到最后一行引用了supervisord.d
文件夹内以ini
为文件后缀的文件。
1 | [include] |
有的Linux系统默认是.conf
结尾的配置文件,需要根据具体系统定义配置文件后缀。
使用
查看安装版本
1 | supervisord -v |
添加程序
这里用一个简单的输出日期时间的程序来演示。
1 | mkdir -p /home/shuyi/echo-time |
写一个定时输出时间的shell命令。
1 | cat echo_time |
可以直接执行这个脚本,每隔1秒钟就会输出一次当前时间。
1 | sh echo_time |
现在进行配置文件创建。
1 | sudo touch /etc/supervisord.d/echo-time.ini |
先写一个简单的配置,里面只有一个启动命令,后面会有比较详细的介绍。
1 | cat /etc/supervisord.d/echo-time.ini |
添加完成之后重新读取配置。
1 | sudo supervisorctl reread |
更新进程。
1 | sudo supervisorctl update |
这样刚才添加程序的就运行起来了,通过ps
命令可以看到运行的进程(启动用户为root)。
1 | ps -aux | grep echo |
查看输出日志,可以看到进程在往文件里面打印内容了。
1 | tail -f echo.log |
查看进程运行状态
1 | sudo supervisorctl status |
Web管理
为了方便管理,可以开启自带的web控制台。
修改/etc/supervisord.conf
配置文件。
1 | [inet_http_server] ; web界面配置 |
重启supervisord。
1 | sudo systemctl restart supervisord |
打开http://192.168.0.112:9001
页面就可以看到所有管理中的应用程序的状态。
如果出现无法访问的问题,应该是防火墙没有开,可以通过下面的命令在centos打开9001端口。
1 | sudo firewall-cmd --permanent --add-port=9001/tcp |
再次访问就可以看到页面了。
在这个页面用户可以选择重启(restart)、停止(stop)、清除日志(clear log)或者查看日志(Tail -f),非常方便。
常用配置
配置样例
1 | [program: x] ; x为程序名称,supervisord会根据这个名字管理进程 |
重启次数控制
在上面的常用配置中可以看到,有autorestart
、startsecs
和startretries
控制程序的重启。
当启动程序的时候,程序在等待startsecs
秒之后才进入RUNNING,supervisor认为程序启动成功,然后程序从RUNNING状态EXIT的情况下,supervisor才会尝试无限次数重启。
如果在startsecs
秒之后没有进入RUNNING状态,说明程序启动失败,此时启动失败次数+1。
当启动失败次数超过startretries
之后,supervisor才会停止尝试重启。
我们使用一个新的echo_failed脚本,这个脚本在原来的echo_time做了一些修改,去掉了while循环,在等待2秒之后直接退出程序。
1 | cat echo_failed |
修改这个程序的supervisord配置文件。
1 | cat /etc/supervisord.d/echo-time.ini |
重新读取配置文件,更新程序。
1 | sudo supervisorctl reread |
然后启动程序发现系统在重试了三次之后就不再尝试,这个进程进入了FATAL状态。
1 | sudo supervisorctl start echo_time |
查看日志。
1 | tail -200f echo.log |
检查状态,发现是FATAL状态,supervisord并没有坚持重启。
1 | sudo supervisorctl status echo_time |
当我们把配置文件里面的startsecs
设置成1秒。
1 | cat /etc/supervisord.d/echo-time.ini |
每次启动echo_time脚本之后1秒之内程序都是在运行的,supervisor认为程序是RUNNING状态,当2秒之后supervisor尝试重新拉起echo_time程序,重试失败次数会重新从0开始,并不会超过startretries
阈值。
注意
如果使用supervisor监控shell脚本,不能在脚本中完全使用nohup、setsid等后台运行的命令,不然supervisor会认为程序自动退出从而不断重启脚本。
参考
Supervisor: A Process Control System
Supervisor使用教程
Supervisor (进程管理利器) 使用说明 - 运维笔记