程序挂了之后别再跟我说让我帮你重启啦! 让supervisor帮你搞定...
有啥用?
很多我们项目排期进入联调、测试阶段,如果QA同学是直接跟你要一个后端环境的话,那简单点大概率你就直接使用./xxx &的方式启动程序。
但是说不定他测着测着触发了啥预期外的东西,程序就挂了。这时你可能还没到公司呢!QA同学就给你打电话来了,一顿客套话,辛苦xxx同学帮忙启动一下后端的程序......
所以了解下supervisor这个工具还是很有必要的,它可以自动将挂了的程序重新拉起来。然后我们还能指定它的错误日志输出的位置。代码上线前,我们不仅可以关注到QA同学提到的Case,还能去看看程序的error log、wanring 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帮你搞定...的更多相关文章
- Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)
对Qt5稍有熟悉的童鞋都知道信号.槽的自动连接机制.该机制使得qt designer 设计的UI中包含的控件,可以不通过显式connect,直接和cpp中的相应槽相关联.该机制的详细文章见 http: ...
- node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
第七章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- [转] Java程序员学C#基本语法两个小时搞定(对比学习)
Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...
- 手把手教你制作微信小程序,开源、免费、快速搞定
最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...
- 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- 第一部分 记事本搞定第一个C#程序和编译过程剖析
记事本搞定第一个C#程序 进行下面三个步骤:编码,编译和托管运行. 1.记事本进行编码: using System; class Program{ public static void Main() ...
- Mac下将C程序创建为动态链接库再由另一个C程序调用
写C的时候需要调用之前的一个C程序,想用动态链接库的方式.Mac下的动态链接库是dylib,与Linux下的.os或Windows下的.dll不同.由于之前没有接触过,所以翻了大量的博客,然而在编译过 ...
- 从程序员到项目主管再到项目总监,一个IT从业者三个职业生涯阶段的工作生活日常
这是王不留的第 8 篇原创文章 前段时间写过<王不留的十多年工作和生活的流水帐>,在知乎.简书,还有不少微信的朋友私信问我每天四点钟是如何做到的?你现在的作息时间是怎么安排的? 于是,我将 ...
- Java程序员学C#基本语法两个小时搞定(对比学习)
对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import ...
随机推荐
- 【洛谷P5008 逛庭院】tarjan缩点+贪心
既然没有题解,那么我就来提供给一份. -- 首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪 ...
- kubernetes 降本增效标准指南|ProphetPilot:容器智能成本管理引擎
作者 田奇,腾讯云高级工程师,专注大规模离在线混部,弹性伸缩,云原生成本优化,熟悉Kubernetes,关注云原生大数据.AI. 王孝威,腾讯云容器产品经理,热衷于为客户提供高效的 Kubernete ...
- vue3.0使用ant-design-vue进行按需加载原来这么简单
下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...
- kali操作系统添加中文输入法
今天一通操作真心累啊.想安装搜狗输入法,百度搜索了好多 三步走:https://blog.csdn.net/qq_44110340/article/details/101382732 一顿操作猛如虎, ...
- 货币兑换问题(动态规划法)——Python实现
# 动态规划法求解货币兑换问题 # 货币系统有 n 种硬币,面值为 v1,v2,v3...vn,其中 v1=1,使用总值为money的钱与之兑换,求如何使硬币的数目最少,即 x1,x2,x3... ...
- 并发队列ConcurrentLinkedQueue与LinkedBlockingQueue源码分析与对比
目录 前言 ConcurrentLinkedQueue 使用方法 存储结构 初始化 入队 出队 获取容器元素数量 LinkedBlockingQueue 使用方法 存储结构 初始化 入队 出队 获取容 ...
- noip模拟32[好数学啊]
noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...
- CentOS Linux Cockpit 管理工具使用
1.安装 # yum install cockpit 2.启动服务 # systemctl start cockpit.socket 3.设置开机启动 # systemctl enable coc ...
- Cookie和Session得使用理解
Cookie 饼干 什么是Cokkie? 1.Cookie 翻译过来是饼干的意思. 2.Cookie 是服务器通知客户端保存键值对的一种技术. 3.客户端有了 Cookie 后,每次请求都发送给服务器 ...
- CVE-2020-0796提权操作
简介 最新的windows10中使用了SMBv3协议,SMBv3协议在压缩消息时,未对头部数据做任何检查,导致恶意攻击者可以直接使用,从而导致内存破坏漏洞. 该漏洞可远程进行攻击目标系统,但目前只做到 ...