linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点

您所在的位置:网站首页 刀塔传奇普通任务攻略 linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点

linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点

2023-12-18 22:15| 来源: 网络整理| 查看: 265

简介

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 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3