程序挂了之后别再跟我说让我帮你重启啦! 让supervisor帮你搞定...

简介: 程序挂了之后别再跟我说让我帮你重启啦! 让supervisor帮你搞定...

有啥用?#


很多我们项目排期进入联调、测试阶段,如果QA同学是直接跟你要一个后端环境的话,那简单点大概率你就直接使用./xxx &的方式启动程序。


但是说不定他测着测着触发了啥预期外的东西,程序就挂了。这时你可能还没到公司呢!QA同学就给你打电话来了,一顿客套话,辛苦xxx同学帮忙启动一下后端的程序......

所以了解下supervisor这个工具还是很有必要的,它可以自动将挂了的程序重新拉起来。然后我们还能指定它的错误日志输出的位置。代码上线前,我们不仅可以关注到QA同学提到的Case,还能去看看程序的error logwanring log中有没有QA同学没有发现的问题,双份保险。


嗯......

supervisor用起来很简单,4分钟了解下即可。


安装#


~]# yum list | grep  supervisor


安装之后,我们就得到的了如下3个二进制的命令:

echo_supervisor_conf: 将supervisor相关的所有配置打印出来。

supervisord:启动命令。

supervisorctl:管理我们托管进supervisor中的进程。


生成配置文件#


其实你安装完supervisor之后,会自动生成一份配置文件:/etc/supervisor.conf

但是我发现在centos6中的安装的supervisor生成的配置文件不能直接用,少了很多东西。所以才有了本小结中的手动生成一份配置文件。


~]# echo_supervisord_conf > /etc/supervisord.conf


你可以参照下面的配置,去修改你的自己的配置,其实我也没有定制什么东西,就是保留了必要的配置参数而已。


1、配置文件中的; 是注释符号

2、为了让篇幅短一点,配置文件中没啥用的配置、注释、或者像什么提供一个可视化的界面这种鸡肋的东西,我就直接删掉了。有一天你自己的真正去用的时候可以挨个看看,也都不复杂。


[unix_http_server]
file=/run/supervisor.sock   ; (the path to the socket file)
[supervisord]
logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///run/supervisor.sock ; use a unix:// URL  for a unix socket
[include]
files = supervisord.d/*.ini


第一个注意点:linux中的程序启动之后,会有个对应的socket文件。supervisord启动之后这个socket文件位置通过[unix_http_server]中的file指定。 而且supervisorctl命令需要和supervisord在本地基于socket文件交互,所以[supervisorctl]serverurl要和[unix_http_server]中的file保持同步。


第二个注意点:其实希望大家重点关注的就是上面这个配置文件中`[include]`部分,它会加载supervisord.d/目录下所有的x.ini文件。

在/etc目录下创建:supervisord.d目录存放ini文件。

*.ini文件是啥呢?

答案:比如你想将程序A托付给supervisor管理,那就按要求的格式,为程序A创建一个A.ini配置文件,在这个文件中定义好,程序A的二进制文件在哪里、执行啥命令启动程序A、日志文件在哪里...等等。


启动supervisor#


Centos7


systemctl start supervisord;systemctl enable supervisord


Centos6


# 查看帮助文档
~]# supervisord --help
supervisord -- run a set of applications as daemons.
Usage: /root/.jumbo/bin/supervisord [options]
Options:
-c/--configuration FILENAME -- configuration file path (searches if not given)
...
# 启动
~]# supervisord -c /etc/supervisord.conf


自定义配置文件#


*.ini文件的格式可以通过echo_supervisor_conf命令找到,它就长下面这样:



所以参考这个配置文件,我们可以搞一个自己的ini配置,如下:


[program:bairimeng_machi]
;bairimeng_machi是自定义的项目名称,之后supercisorctl命令管理bairimeng_machi
;command 启动程序的相对路径, can take args
command=/home/worker/workerspace/machi.sh 
numprocs=1                                  
;directory 在执行command之前,需要切换到哪个目录中
directory=/home/worker/workerspace/  
;supervisord启动时,是否同时启动
autostart=true        
;autorestart意外退出后,是否重新启动
autorestart=true      
startsecs=30          
startretries=3        
exitcodes=0,2        
stopsignal=QUIT      
stopwaitsecs=10       
;user 使用哪个用户启动本程序
user=worker             
;redirect_stderr将标准错误,重定向到标准输出
redirect_stderr=true  
;stdout_logfile 标准输出的日志文件的位置
stdout_logfile=/home/worker/workerspace/etcd.stdout.log 
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5                             
stdout_capture_maxbytes=1MB  
stdout_events_enabled=false


配置文件中的目录最好提前创建出来,并把所有者、所属组都指向配置文件中:user 部分指定的用户。

不然很可能因为该用户没有创建目录的权限,而导致整个任务失败。


控制命令#


当有新的ini文件被托管进来时,执行如下命令启动被托管的程序


]# supervisorctl update


查看被托管程序的状态:


]# supervisorctl status  bairimeng_machi
bairimeng_machi                  STARTING
]# supervisorctl status  bairimeng_machi
bairimeng_machi                  RUNNING   pid 10630, uptime 0:02:17


关闭被托管的程序


]# supervisorctl stop bairimeng_machi
bairimeng_machi: stopped
]# supervisorctl status  bairimeng_machi
bairimeng_machi                  STOPPED   Aug 29 11:38 PM


启动程序


]# supervisorctl start bairimeng_machi
bairimeng_machi: started
]# supervisorctl status bairimeng_machi
bairimeng_machi                  RUNNING   pid 17810, uptime 0:01:06


重启


supervisorctl restart bairimeng_machi


重新启动配置中的所有程序


]# supervisorctl reload
Restarted supervisord
]# supervisorctl status  bairimeng_machi
bairimeng_machi                  STARTING


到这里,你就可以放心大胆的去做别的事了,程序挂掉之后,supervisor会自动帮你拉起的。

相关文章
|
9天前
|
Linux 数据库
Linux服务如何实现服务器重启后的服务延迟自启动?
【10月更文挑战第25天】Linux服务如何实现服务器重启后的服务延迟自启动?
45 3
|
3月前
|
关系型数据库 MySQL Linux
在Linux中,如何启动、停止、重启一个系统服务?
在Linux中,如何启动、停止、重启一个系统服务?
|
6月前
|
存储
NameNode 故障无法重新启动解决方法
当NameNode进程挂掉时,若无数据丢失,可直接使用`hdfs --daemon start namenode`重启。但若数据丢失,需从SecondaryNameNode恢复。首先查看启动日志,确认因数据丢失导致的未启动成功问题。接着,将SecondaryNameNode的备份数据拷贝至NameNode的数据存储目录,目录路径在`core-site.xml`中设定。进入NameNode节点,使用`scp`命令从SecondaryNameNode复制数据后,重启NameNode进程,故障即可修复。
538 0
C++采用Daemon进行后台程序部署
在C++中,如果要让一个程序一直在后台运行并且和终端会话分离,我们可以将其作为守护进程运行,以下是创建C++守护进程的一般步骤。
|
存储 分布式计算 资源调度
Hadoop集群部署和启动与关闭
Hadoop集群部署和启动与关闭
|
存储 资源调度 分布式计算
Hadoop集群启动和停止方法
Hadoop集群启动和停止方法
467 0
|
监控 应用服务中间件
实现Weblogic服务进程监控及自动重启脚本
Weblogic服务偶尔会挂掉,为了使weblogic能够在挂掉后第一时间能够重启,基于此背景下实现Weblogic进程监控及自动重启脚本,本文主要记录实现过程中遇到的问题及解决办法。
1623 0
|
消息中间件 Java Kafka
kafka 0.11x 启动30秒后自动停止,报【另一个程序正在使用此文件,进程无法访问】
环境:kafka_2.11-1.1.0,win7_64,java8 现象: 启动30秒后自动停止,报【另一个程序正在使用此文件,进程无法访问】 [2018-06-06 14:32:46,784] INFO [Log partition=myTopic-0, dir=D:\kafka_2.
2900 0
|
Linux
使用systemd管理Yii2(或其他)队列服务,实现故障重启、开机自启动等功能
以Centos7为例 在 /usr/lib/systemd/system 目录新建 queue.service 文件 [Unit] Description=Yii Queue Server After=network.
2814 0
|
MySQL 关系型数据库 Linux
Linux启动/停止/重启Mysql数据库的方法
1、查看mysql版本方法一:status;方法二:select version(); 2、Mysql启动、停止、重启常用命令a、启动方式1、使用 service 启动:[root@localhost /]# service mysqld start (5.
8525 0