linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点
linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、supervisorctlupdate命令注意点
简介
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。
也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程
。
安装
yum方式安装
要先确保系统上安装了yum,如果没有安装,先去安装下 linux下载安装yum
yum命令安装插件
// 下载安装 epel(装上了 EPEL 之后,就相当于添加了一个第三方源)
yum install -y epel-release
// 下载安装 supervisor
yum install -y supervisor
卸载
# 卸载程序
yum -y remove supervisor
# 删除 /etc 目录下的supervisor相关内容
cd /etc/
ll |grep supervisor
rm -rf supervisord.conf supervisord.d
# 删除supervisor日志相关内容
cd /var/log
rm -rf supervisor/
配置
主配置文件:/etc/supervisord.conf
子进程管理配置文件目录:/etc/supervisord.d/
主配置文件
主配置文件/etc/supervisord.conf
声明了子配置文件的路径,如下:
要注意子配置文件的后缀,修改为*.conf(或者不修改使用默认的 *.ini也可,那么新建的自配置文件名称就是ini为后缀)
[include] files = supervisord.d/*.conf
子配置文件
tomcat启动示例
需要注意,;
表示注释
以下是一个tomcat的程序启动示例
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
springboot项目启动示例
在/etc/supervisord.d/
下建立cloud.conf
文件,此子程序作用是启动一个springboot项目
内容如下
启动一个springboot的子配置文件示例:
[program:demo] ;子程序名称是demo
command=java -jar /root/cloud-demo/demo.jar ;程序启动执行的命令
stdout_logfile=/root/cloud-demo/logfile.log ;日志输出的文件
autostart=true ;在supervisord启动的时候也自动启动(类似开机自启)
autorestart=false;程序退出后自动重启,选值[unexpected,true,false]默认unexpected,进程意外杀死才重启
startsecs=5 ;启动5秒后没有异常退出,就表示进程正常启动了,默认为1秒
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
启动
启动主进程
配置好子配置文件后,启动主程序
// 启动主程序,如果已经启动了,杀掉主进程再执行这个命令
supervisord -c /etc/supervisord.conf
主进程启动后,又修改主进程配置文件
如果是主进程启动后,又修改了主进程的配置文件,想要生效,supervisorctl reload
即可重新加载主配置
supervisorctl reload
启动子进程
其实在子进程的配置文件里有写autostart=true
也就是主进程启动时,子进程自动启动,所以子进程是已经在启动状态了,可以用 supervisorctl status [程序名]
查看所有子进程或单个进程的运行状态
# 查看单个 子程序的
supervisorctl status demo
常用管理命令
sudo systemctl stop supervisor # 停止supervisor(主程序)服务,最好先停掉所有子进程再执行
sudo systemctl start supervisor # 启动supervisor(主程序)服务
supervisorctl shutdown #关闭所有任务
supervisorctl stop|start|restart program_name #启动或停止服务
supervisorctl status #查看所有任务状态
# 如果新增了配置文件 可以在命令行使用 update更新子任务(将子程序纳入主程序来管理,并且启动子程序)
sudo supervisorctl update # 默认更新全部 后面加 任务文件名 启动特定任务
supervisorctl reload # 主配置文件修改后,执行使之生效
supervisorctl reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
开机自启
systemctl enable supervisord
多程序管理
可在一个子配置文件中配置多个程序
管理方式一样supervisorctl ... 程序名
[program:demo]
command=java -jar /root/cloud-demo/cloud-demo.jar
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
[program:demo2]
command=java -jar /root/cloud-demo/cloud-demo2.jar
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
-
修改子配置文件后,执行
supervisorctl update [程序名]
更新子任务(将子程序纳入主程序来管理,并且启动子程序),将子任务启动起来。需要注意: 当子配置
autostart=true
时,才会启动子任务,否则只是达到reread
的效果supervisorctl update
-
或者我只想将新增的程序交给主程序来管理,但是现在不想启动它,那么就使用
supervisorctl reread
,当我想要启动它时,使用supervisorctl update [程序名]
即可(写程序名是只执行单个程序,不写则是执行全部被新加入的程序)supervisorctl reread # 读取新加入的程序 supervisorctl update [程序名] # 执行单个或全部被新加入的程序
也可一个程序创建一个子配置文件
cloud1.conf
文件
[program:demo]
command=java -jar /root/cloud-demo/cloud-demo.jar
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
cloud2.conf
文件
[program:demo2]
command=java -jar /root/cloud-demo/cloud-demo2.jar
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
群组
配置群组后,可以声明属于此群组的程序成员
如下,demo群组下有cloud和cloud2两个成员
# 群组名 可选
[group:demo]
programs=cloud,cloud2
[program:cloud]
command=java -jar /root/cloud-demo/cloud-demo.jar
stdout_logfile=/root/cloud-demo/logfile.log
autostart=false
stopasgroup=true
killasgroup=true
[program:cloud2]
command=java -jar /root/cloud-demo/cloud-demo2.jar
stdout_logfile=/root/cloud-demo/logfile2.log
autostart=false
stopasgroup=true
killasgroup=true
群组的管理
supervisorctl stop demo:* # 停止demo群组下所有程序
supervisorctl stop demo2:cloud demo2:cloud2 ... # 停止某群组下多个程序 空格隔开
supervisorctl restart demo2:* # 重启群组下所有
注意群组
- 群组中的子程序名称不要重复
- 例如已有一个
cloud子程序
在运行着,如果新建了一个群组,并且群组里再次声明了一个cloud子程序
,那么群组里的cloud子程序会把之前创建的单独子程序cloud覆盖
掉
遇到的问题
找不到xxx命令
原因:supervisor用的环境变量是基于supervisor.conf里设置的环境变量
以java命令为例
解决方案:
- 方案一:
在子配置文件中command
写全命令的所在路径
command=/root/app/java/jdk1.8/bin/java -jar /root/cloud-demo/cloud-demo.jar
如果忘记命令所在位置了,直接which java
查看一下
- 方案二:
启动主程序时不要用systemctl start supervisord.service
,而是使用上文中提到的supervisord -c /etc/supervisord.conf
来执行
supervisord -c /etc/supervisord.conf
unix:///var/run/supervisor/supervisor.sock no such file
我遇到这个问题,后来发现是supervisor没启动导致的 0_0
网上的解决方案是执行命令:
unlink /var/run/supervisor/supervisor.sock
Unlinking stale socket /var/run/supervisor/supervisor.sock
解决方案:
unlink /var/run/supervisor/supervisor.sock
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.
这个问题就是端口被占用了,把supervisor杀掉,重启一下试试
ps aux | grep supervisord
kill - 9 进程ID
Error: Cannot open an HTTP server: socket.error reported errno.ENOENT (2)
一般就是/run/supervisor/
目录缺失导致,重新创建一个就可以了mkdir /run/supervisor
更多推荐
所有评论(0)