如何让Java应用成为杀不死的小强?(上篇)
各位坐稳扶好,我们要开车了。不过在开车之前,我们还是例行回顾一下上期分享的要点。
项庄舞剑意在沛公,而咱们上期主要借助应用服务器 Resin 的源码,体验了一次 JMX 的真实应用。鉴于 9012 年的很多攻城狮从未接触过 Resin 应用服务器,咱们也没有挖的太深,点到为止。
今天我们说些什么?先抛个问题:“如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否有机制能启动起来?”
你或许对问题本身还有点不解,暂不针对问题本身进行作答,先不妨一起体验体验 Resin 应用服务器背后一个有意思的事情。
打开控制台,输入命令 ./resin.sh start 启动 Resin 应用服务器,通过源码启动也未尝不可。启动完毕后,在控制台输入 jps 命令,会发现一些不可告人的秘密。
10597 WatchdogManager 10599 Resin
后台居然启动了两个 Java 进程,先不关心都是干啥用的,我们不妨尝试把 Resin 进程给干掉,先执行 kill -9 10599 命令,然后再次执行 jps 命令,看看效果。
10597 WatchdogManager 10708 Resin
哎呦,确实有些不可思议,Resin 进程又自动起来了,而且进程 ID 变成了 10708。
难道是我们操作有误?那再重新杀一下 Resin 进程,执行 kill -9 10708 命令,然后再执行 jps 命令,确认一下是不是我们操作失误导致的。
10597 WatchdogManager 10765 Resin
天啦撸,Resin 进程 ID 变成了 10765,而且又自动启来啦。
不得不说 Resin 进程真是一个杀不死的小强,面对这种咱们啥也没有做,怎么杀 Resin 应用进程都杀不死,你是否会有好奇,这背后是咋回事?
此时我们再杀一下 WatchdogManager 进程,执行一下 kill -9 10597 命令,然后再执行 jps 命令。
发现 WatchdogManager 进程以及 Resin 的进程全部都消失不见,貌似还真有点意思,但是这背后到底隐藏了什么秘密呢?到底又是怎么做到的呢?
如果这个时候咱们直接钻进 Resin 的源码,你可能会直接疯掉,我们还是先从效果上大胆的去猜一猜。
猜想一:WatchdogManager 进程咱们姑且就认为是掌管丫鬟的大总管,而 Resin 进程相当于 丫鬟,大总管负责下发命令让丫鬟去干活,一旦丫鬟进程 down 掉,大总管进程就下发命令重新启动把丫鬟进程启动起来;
猜想二:如果 WatchdogManager 大总管 down 了,那么被看管的丫鬟由于无法与大总管通讯,丫鬟 Resin 进程也会自动停掉,释放资源,重获新生。
依据实验效果我们大胆的猜想,如上图示意,主要有两件事需要去思考,大总管如何下发命令让丫鬟干活;丫鬟如何与大总管保持联系,一旦联系不上大总管丫鬟就自由了。
其实说的稍微技术一点,那就是大总管进程应该会负责管理丫鬟进程的状态,一旦发现丫鬟进程异常,就尝试让丫鬟重新跑起来;其中丫鬟进程应该与大总管实时保持心跳通讯,一旦通讯失败自身进程就退出。
好了,这期主要通过分析 Resin 应用服务器启动的进程,向你抛了一个大大的砖,不知道你心中是否已经有解决思路,到底该如何实现,我们将会在下期揭开谜底。

如何让Java应用成为杀不死的小强?(上篇)的更多相关文章
- 如何让Java应用成为杀不死的小强?(中篇)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期我们抛了一个砖:“如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否有机制能启动起来?” ...
- 如何让Java应用成为杀不死的小强?(下篇)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 经过前两期的铺垫及烧脑的分享,我们大概对「如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否 ...
- 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程
今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...
- Linux中杀不死的进程
前段时间,一哥们,去杀Linux服务器的进程,发现kill命令失灵了,怎么杀都杀不死. 然后上网查了下资料,原来是要被杀的进程,成为了僵尸进程. 僵尸进程的查看方法: 利用命令ps,可以看到有标记为Z ...
- paip.杀不死进程的原因--僵尸进程的解决.txt
paip.杀不死进程的原因--僵尸进程的解决.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- 手把手教你写LKM rookit! 之 杀不死的pid&root后门
......上一节,我们编写了一个基本的lkm模块,从功能上来说它还没有rootkit的特征,这次我们给它添加一点有意思的功能.我们让一个指定的进程杀不死, 曾经,想写一个谁也杀不死的进程,进程能捕捉 ...
- Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程
Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...
- 不死的小强 .net core 微服务 快速开发框架 Viper 限流
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...
随机推荐
- python 深浅拷贝 元组 字典 集合操作
深浅拷贝 :值拷贝 :ls = [,,] res = ls 则print(res)就是[,,] 浅拷贝 :ls.copy() 深拷贝:ls3 = deepcopy(ls) # 新开辟列表空间,ls列表 ...
- idea创建简单web项目分析Servlet的请求转发与重定向的区别
注:如需转载,请附上原文链接,如有建议或意见,欢迎批评指正! 需求说明: // index.jsp页面 1 <% 2 String basePath = request.getScheme() ...
- 01 ORM框架概述
ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ...
- vue中v-if和v-show的区别
v-if.v-show顾名思义就是用来判断视图层展示效果的. v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回真值的时候被渲染. v-show 指的是单纯的切换元素的样式dis ...
- [android]从书中编码方式,看编程思想
<Android权威编程指南第3版>今天学习到第10章,感叹经验丰富的编程理念——解耦合. 编程理念肯定是尽可能解除耦合,让代码可以复用,书中多次提到关于参数传递的解耦,这又出现一次. 本 ...
- 如何让antd的Modal组件的确认和取消不显示(或自定义按钮)(转载)
使用Modal中的footer属性,如下: <Modal title="更改成员" visible={visible} confirmLoading={confirmLoad ...
- JDK中线程池参详细解析
在jdk中为我们提供了三种创建线程池的方式,但是在阿里的编码规范里面都是明确禁止使用这三种api去创建线程池,推荐我们去自定义线程池.为什么? 要回答为什么,我们需要明白创建线程池时,各参数的作用: ...
- oracle中表空间管理,游标
一.表空间 oracle使用表空间来管理数据库的对象(表,序列,过程,函数,游标等). oracle的逻辑结构(看不见的):oracle数据库 => 表空间 => 表 序列 过程等对象. ...
- Java内部类的四种分类以及作用介绍
内部类内容解析 内部类的区分 内部类分别有成员内部类.局部内部类.匿名内部类.静态内部类,接下来将分别介绍. 成员内部类 就是位于外部类成员位置的类.与外部类的属性.方法并列. 成员内部类作为外部类的 ...
- JMeter报错:Address already in use : connect
Address already in use : connect的解决办法: 修改操作系统注册表1.打开注册表:regedit2.找到HKEY_LOCAL_MACHINE\SYSTEM\Current ...