有啥用?

很多我们项目排期进入联调、测试阶段,如果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会自动帮你拉起的。

求关注啦

程序挂了之后别再跟我说让我帮你重启啦! 让supervisor帮你搞定...的更多相关文章

  1. Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)

    对Qt5稍有熟悉的童鞋都知道信号.槽的自动连接机制.该机制使得qt designer 设计的UI中包含的控件,可以不通过显式connect,直接和cpp中的相应槽相关联.该机制的详细文章见 http: ...

  2. node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)

    第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  3. [转] Java程序员学C#基本语法两个小时搞定(对比学习)

    Java程序员学C#基本语法两个小时搞定(对比学习)   对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...

  4. 手把手教你制作微信小程序,开源、免费、快速搞定

    最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...

  5. 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  6. 第一部分 记事本搞定第一个C#程序和编译过程剖析

    记事本搞定第一个C#程序 进行下面三个步骤:编码,编译和托管运行. 1.记事本进行编码: using System; class Program{ public static void Main() ...

  7. Mac下将C程序创建为动态链接库再由另一个C程序调用

    写C的时候需要调用之前的一个C程序,想用动态链接库的方式.Mac下的动态链接库是dylib,与Linux下的.os或Windows下的.dll不同.由于之前没有接触过,所以翻了大量的博客,然而在编译过 ...

  8. 从程序员到项目主管再到项目总监,一个IT从业者三个职业生涯阶段的工作生活日常

    这是王不留的第 8 篇原创文章 前段时间写过<王不留的十多年工作和生活的流水帐>,在知乎.简书,还有不少微信的朋友私信问我每天四点钟是如何做到的?你现在的作息时间是怎么安排的? 于是,我将 ...

  9. Java程序员学C#基本语法两个小时搞定(对比学习)

    对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import ...

随机推荐

  1. powerdesigner连接postgresql数据库生成pdm及word文档

    1.准备软件: powerdesigner165与postgresql的驱动:psqlodbc_11_01_0000 2.安装并破解完成powerdesigner165 参看链接:https://ww ...

  2. 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面

    一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...

  3. 7.15考试总结(NOIP模拟16)[Star Way To Heaven·God Knows·Lost My Music]

    败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理 ...

  4. Python自动化测试面试题-Python基础篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...

  5. 10分钟物联网设备接入阿里云IoT平台

    前言最近尝试了一下阿里云IoT物联网平台,还是蛮强大的.在此记录一下学习过程.本教程不需要任何外围硬件,一台电脑和一根能上网的网线即可.算是一篇Hello World了.先上效果图 第一章 准备工作1 ...

  6. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

  7. K8S为什么要弃用Docker?Dockershim将移除

    一.背景由于最近知道了 K8s 新版本(v1.20)确定弃用 Docker 的消息,为了明确是否会对现有系统架构产生响,所以对涉及到的相关技术进行了一定的梳理(索性的是对现有的系统架构基本无影响:&g ...

  8. python3中的希尔排序

    def shell_sort(alist): n = len(alist) # 初始步长 gap = round(n / 2) while gap > 0: # 按步长进行插入排序 for i ...

  9. MSF+Nmap TCP空闲扫描

    MSF+Nmap TCP空闲扫描 前言 TCP空闲扫描是一种高级的扫描技术,可以冒充内网中另一台IP地址来对内网中的目标进行隐秘的扫描. 正文 在进行扫描之前,我们需要了解一个概念,即递增IP帧标识, ...

  10. C++ //继承中的对象模型 //利用开发人员命令提示工具查看对象模型 //父类中所有非静态成员属性都会被 子类继承下去 //父类中私有成员属性 是被编译器给隐藏了 因此是访问不到 但是确实被继承下去了

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 /* 9 #include &l ...