java检测tomcat宕机_Tomcat意外宕机分析

java检测tomcat宕机_Tomcat意外宕机分析之前在网上看过一篇文章,是讲Tomcat进程意外退出的,我看完感觉好奇,自己也测试了下,果然是有这种问题,所以自己也借此总结一下。先简单说下测试过程,先创建一个web服务启动test.sh,内容如下:#!/bin/bashcd/usr/software/tomcat/apache-tomcat-7.0.81/bin/./catalina.shstarttail-f/usr/software/…

大家好,又见面了,我是你们的朋友全栈君。

之前在网上看过一篇文章,是讲Tomcat进程意外退出的,我看完感觉好奇,自己也测试了下,果然是有这种问题,所以自己也借此总结一下。

先简单说下测试过程,先创建一个web服务启动 test.sh,内容如下:

#!/bin/bash

cd/usr/software/tomcat/apache-tomcat-7.0.81/bin/./catalina.sh start

tail-f /usr/software/tomcat/apache-tomcat-7.0.81/logs/catalina.out

然后启动该脚本,服务起来了,可以正常访问。

tomcat启动之后,当前shell进程并没有退出,而是挂住在tail进程,往终端输出日志内容。这种情况下:

1)、如果我先直接关掉ssh窗口后,Java进程会退出,服务不可用。

2)、而我如果先 用ctrl-c终止test.sh进程,然后再关闭ssh终端的话,这时Java进程不会退出。服务没有受到影响,仍然可用。

3)、下面我又把最后tail这一行去掉,发现直接关掉ssh终端窗口,Java进程也不会退出,服务不受影响。

#!/bin/bash

cd/usr/software/tomcat/apache-tomcat-7.0.81/bin/./catalina.sh start

4)、最后我再次恢复tail这一行,然后在开头再加上 set -m, 直接关掉ssh窗口Java进程同样也不会退出,服务同样也不受影响。

#!/bin/bash

set-m

cd/usr/software/tomcat/apache-tomcat-7.0.81/bin/./catalina.sh start

tail-f /usr/software/tomcat/apache-tomcat-7.0.81/logs/catalina.out

到这里是不是有点晕了,不急,待我慢慢道出原因来。

这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭ssh终端窗口会导致java进程退出?

经过测试,有发现:

a) 用 ctrl-c 终止当前test.sh进程时,系统events进程向 java 和 tail 两个进程发送了SIGINT 信号

b) 关闭ssh终端窗口时,sshd向下游进程发送SIGHUP, java进程也会收到。

后来通过google后了解到: shell在非交互模式下对后台进程处理SIGINT信号时设置的是IGNORE。

交互模式与非交互模式对作业控制(job control)默认方式不同:

I)在交互模式下,因为作业控制的需要,shell不会对后台进程处理SIGINT信号设置为忽略。因此这样的话,父进程会把收到的键盘事件比如ctrl-c之类的SIGINT传播给进程组中的每个成员(假设后台进程也是父进程组的成员),那么终端随意ctrl-c就可能导致所有的后台进程退出,显然这样是不合理的。因此,在交互模式下的后台进程会设置一个自己的进程组ID。

II)而非交互模式下,通常是不需要作业控制的,所以作业控制在非交互模式下默认也是关闭的(当然也可以在脚本里通过选项set -m打开作业控制选项)。不开启作业控制的话,脚本里的后台进程可以通过设置忽略SIGINT信号来避免父进程对组中成员的传播,因为对它来说这个信号已经没有意义。

在非交互模式下,shell对java进程设置了SIGINT,SIGQUIT信号设置了忽略,但并没有对SIGHUP信号设为忽略,回头看上面说的,直接关闭ssh终端窗口时,sshd向下游进程发送SIGHUP, java进程也会收到。

再看一下当时的进程层级:

|-sshd(1622)-+-sshd(11681)—sshd(11699)—bash(11700)—test.sh(13285)—tail(13299)

sshd把SIGHUP传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。因为java后台进程从父进程catalina.sh(又是从其父进程test.sh)继承的pgid,所以java进程仍属于test.sh进程组里的成员,收到SIGHUP后退出。

如果我们在test.sh里设置开启作业控制的话,就不会让java进程退出了

#!/bin/bash

set-m

cd/usr/software/tomcat/apache-tomcat-7.0.81/bin/./catalina.sh start

tail-f /usr/software/tomcat/apache-tomcat-7.0.81/logs/catalina.out

此时java后台进程继承父进程catalina.sh的pgid,而catalina.sh不再使用test.sh的进程组,而是自己的pid作为pgid,catalina.sh进程在执行完退出后,java进程挂到了init下,java与test.sh进程就完全脱离关系了,bash也不会再向它发送信号。

注: 如果把tail 打印的这一行去掉,为什么Java进程也不会退出,我猜原因应该是,如果没有tail的话, Java进程就不是他们的子进程了,自然怎么操作都不会受影响。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159422.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 微信小程序获取unionid_小程序的openid有什么用

    微信小程序获取unionid_小程序的openid有什么用UniqueID以及openid的获取涉及到用户的敏感信息,返回的数据encryptedData是加密后的数据要提取信息需要对数据进行解密官网提供了解密的算法,将nodejs的版本拿过来稍作修改即可下载cryptojs放到项目的utils目录下 在utils目录下新建decode.js写入以下内容//utils/decode.jsvarCrypto=require…

    2022年10月26日
  • html幻灯片图片切换效果代码,jquery的幻灯片图片切换效果代码分享

    html幻灯片图片切换效果代码,jquery的幻灯片图片切换效果代码分享本文实例讲述了jquery的幻灯片图片切换效果。分享给大家供大家参考。具体如下:这是一款基于jquery的幻灯片图片切换效果代码,有缩略图和标题,可以自定义标题。运行效果图:——————-查看效果下载源码——————-小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式。(1)在head区域引入CSS样式:(2)js代码://$(do…

  • matlab三维图怎么改变颜色_matlab画复杂函数图像

    matlab三维图怎么改变颜色_matlab画复杂函数图像当我们学习surface命令时,已经看到了三维作图的一些端倪。在matlab中我么可以调用mesh(x,y,z)函数来产生三维图像。首先,我们用z=cos(x)sin(y)在-2pi≤x,y≤2pi内的图像来看看:[x,y]=meshgrid(-2*pi:0.1:2*pi);z=cos(x).*sin(y);mesh(x,y,z),xlabel(‘x’),ylabel(‘y’),zla…

  • Navicat MySQL 激活码【中文破解版】

    (Navicat MySQL 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • qdialog 返回值_python-PyQt QDialog返回响应是或否

    我有一个QDialog类confirmation_dialog=uic.loadUiType(“ui\confirmation_dialog.ui”)[0]classConfirmationDialog(QDialog,confirmation_dialog):def__init__(self,parent=None):QDialog.__init__(self,parent)self.s…

  • Tomcat频繁宕机的原因分析「建议收藏」

    Tomcat频繁宕机的原因分析「建议收藏」资源!没有完全释放,用完后要父NULL值;数据库连接顺序关闭;优化JAVA虚拟机加入相应的内存参数;TOMCAT在LINUX下不是很稳定;String类型使用,不符合规范;不要在数据库中获取大段文本;JAVA不推荐用String获取大量信息,造成内存溢出就是它;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号