程序挂了之后别再跟我说让我帮你重启啦! 让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 ...
随机推荐
- 编写mysql多实例启动脚本
脚本原理: 启动MySQL动作: mysqld_safe来执行启动 停止MySQL动作: 使用mysqladmin来执行停止动作 重启的MySQL动作: 原理就是先停止,然后再启动 但是要注意: ...
- 为什么每次下载后必须关闭掉IO流(十五)
读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用,这是为什么呢? java是从c++设计来的,但是无论是C语言还是C++,都需要手动释放内存,j ...
- 01_Nginx下载安装
一.简介 Nginx 是由俄罗斯人 Igor Sysoev 设计开发的,开发工作从2002 年开始,第一次公开发布在 2004 年 10 月 4 日. 官方网站为:http://nginx.org/ ...
- IPV6改造?华为云如此简单
现在很多企业都在搞这个IPV6改造,说实话这个IPV6改造我这边也不是特别精通,也是通过查阅各种资料来了解IPV6这个东西,下面是我查的一些资料大家可以借鉴一下. IPv6改造三步曲--Vecloud ...
- 第二十六篇 -- wifi学习
参考网址:https://blog.csdn.net/zwl1584671413/article/details/77936950 https://blog.csdn.net/Righthek/art ...
- Linux开机以root账户自动登录
最近我们的自动化测试平台需要支持中标麒麟系统,对于我们来说要让这个系统支持分布式自动化测试,最重要的一点就是虚拟机启动后自动以root账户登录系统,并且执行我们的环境配置脚本,那么如何能让它开启自动登 ...
- QML用同一模版多开主窗口
如何动态地创建多个长的一样的主窗口哪(数据当然不一样), 用QML也是可以实现的. 简单的地说, 就是调用多次load即可. QCoreApplication::setAttribute(Qt::AA ...
- CF427C题解
Description 有一张带点权有向图,你要在其中修建若干个检查站,使得对于每一个点 \(p\) ,都有 \(\geq 1\) 个检查站,满足: 存在一条从这个检查站出发到点 \(p\) 的路径: ...
- Vulhub-DC-3靶场
Vulhub-DC-3靶场 前言 今天把DC-3的靶场打了一遍,可以说这个靶场用到的思路是非常经典的,从信息搜集到漏洞利用包括内核提权.最最重要的是为了下载它的提权EXP,我它喵还花了一块二买了个CS ...
- 我们是Android开发,我们都有着光明的未来
作为一名程序员经常会逛v2ex论坛,前几天逛着玩的时候忽然发现一篇文章,标题非常吸引眼球名字叫中年危机的终极解法,作为一个步入而立之年的老人,心里非常激动,到底是啥解决法呢,于是迅速点进去查看. 进去 ...