各位坐稳扶好,我们要开车了。不过在开车之前,我们还是例行回顾一下上期分享的要点。

项庄舞剑意在沛公,而咱们上期主要借助应用服务器 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应用成为杀不死的小强?(上篇)的更多相关文章

  1. 如何让Java应用成为杀不死的小强?(中篇)

    各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期我们抛了一个砖:“如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否有机制能启动起来?” ...

  2. 如何让Java应用成为杀不死的小强?(下篇)

    各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 经过前两期的铺垫及烧脑的分享,我们大概对「如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否 ...

  3. 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程

    今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...

  4. Linux中杀不死的进程

    前段时间,一哥们,去杀Linux服务器的进程,发现kill命令失灵了,怎么杀都杀不死. 然后上网查了下资料,原来是要被杀的进程,成为了僵尸进程. 僵尸进程的查看方法: 利用命令ps,可以看到有标记为Z ...

  5. paip.杀不死进程的原因--僵尸进程的解决.txt

    paip.杀不死进程的原因--僵尸进程的解决.txt 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...

  6. 手把手教你写LKM rookit! 之 杀不死的pid&root后门

    ......上一节,我们编写了一个基本的lkm模块,从功能上来说它还没有rootkit的特征,这次我们给它添加一点有意思的功能.我们让一个指定的进程杀不死, 曾经,想写一个谁也杀不死的进程,进程能捕捉 ...

  7. Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程

    Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...

  8. 不死的小强 .net core 微服务 快速开发框架 Viper 限流

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  9. 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)

    1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...

随机推荐

  1. 日常破解--XCTF easy_apk

    一.题目来源     来源:XCTF社区安卓题目easy_apk 二.破解思路     1.首先运行一下给的apk,发现就一个输入框和一个按钮,随便点击一下,发现弹出Toast验证失败.如下图所示: ...

  2. 一次 Druid 连接池泄露引发的血案!

    最近某个应用程序老是卡,需要重启才能解决问题,导致被各种投诉,排查问题是 Druid 连接池泄露引发的血案.. 异常日志如下: ERROR - com.alibaba.druid.pool.GetCo ...

  3. 02 HDFS 分布式环境实战

    HDFS的主要设计理念 1.存储超大文件 这里的“超大文件”是指几百MB.GB甚至TB级别的文件. 2.最高效的访问模式是 一次写入.多次读取(流式数据访问)3.运行在普通廉价的服务器上 HDFS设计 ...

  4. 机器学习实战:意大利Covid-19病毒感染数学模型及预测

    作者:Gianluca Malato deephub翻译组:刘欣然 当今世界正在与一个新的敌人作斗争,那就是Covid-19病毒. 该病毒自首次在中国出现以来,在世界范围内迅速传播.不幸的是,意大利的 ...

  5. 【工具】---- webpack简析

    1. 什么是webpack 一个现代 JavaScript 应用程序的静态模块打包器(module bundler),它会分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行 ...

  6. c++第一章1.6

    测试已完成(bingo)     1 [单选题] 下面代码能够实现交换操作的函数有(       )   A. swap(int a,int b) { int t=a;a=b;b=t;} B. swa ...

  7. MATLAB神经网络(6) PID神经元网络解耦控制算法——多变量系统控制

    6.1 案例背景 6.1.1 PID神经元网络结构 PID神经元网络从结构上可以分为输入层.隐含层和输出层三层,$n$个控制量的PID神经元网络包含$n$个并列的相同子网络,各个子网络间既相互独立,又 ...

  8. Pyppeteer入门(转载)

    一.简介 Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 A ...

  9. sklearn概述

    Simple and efficient tools for predictive data analysis Accessible to everybody, and reusable in var ...

  10. 【Weiss】【第03章】练习3.21:单数组模拟双栈

    [练习3.21] 编写仅用一个数组而实现两个栈的例程.除非数组的每一个单元都被使用,否则栈例程不能有溢出声明. Answer: 很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引. 如l ...