linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点 |
您所在的位置:网站首页 › 刀塔传奇普通任务攻略 › linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点 |
简介
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管理方式一样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=truecloud2.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 |