java检测tomcat宕机_Tomcat意外宕机分析
之前在网上看过一篇文章,是讲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进程就不是他们的子进程了,自然怎么操作都不会受影响。
java检测tomcat宕机_Tomcat意外宕机分析相关推荐
- java获取tomcat目录结构_Tomcat目录结构详解
Tomcat目录结构图如下: bin目录 存放一些可执行的二进制文件,.sh结尾的为linux下执行命令,.bat结尾的为windows下执行命令. catalina.sh:真正启动tomcat文件, ...
- java获取tomcat目录结构_tomcat目录结构简介_动力节点Java学院整理
tomcat目录结构简介 如果我们有一个web应用,名称为"mail"(同时也是web应用所在目录的名称),那么其目录内不同类型的文件应该服从如下放置的规则: 一般来讲: 对于ht ...
- java打印tomcat内存溢出_tomcat内存溢出问题监控工具
针对杭州数字电视系统内存溢出的问题,对tomcat做了两种监控方式. 注:以下配置都配置到catalina.sh文件中. 一.gclog,这种方式用于观察内存回收情况,显示的内容如下所示: 21184 ...
- Java内存泄漏、性能优化、宕机死锁的N种姿势
导读 本文介绍Java诸多优化实例:第一,排查堆上.堆外内存泄露:第二,使用arthas.jaeger.tcpdump.jstack做性能优化:第三,排查进程异常退出的原因,如被杀.System.ex ...
- 网站服务器宕机怎么办,服务器宕机了该怎么办?
原标题:服务器宕机了该怎么办? 导读 如果Web服务器已经虚拟化,试着ping物理服务器自己的真实IP.这样可以帮助你进一步隔离问题.如果完全无法ping同服务器,而且也已经确定完全检查了网络连接,那 ...
- Facebook史上最严重宕机,全网宕机近七小时,到底是怎么回事?
Facebook史上最严重宕机,全网宕机近七小时,高管赴推特道歉.近7个小时时间,全都挂了Facebook全网宕机,连内网都废了.Twitter成为了最大赢家.对一家互联网巨头来说,这样的状况实在太尴 ...
- java毕业设计——基于java+Jsp+Tomcat的敬老院管理系统设计与实现(毕业论文+程序源码)——敬老院管理系统
基于java+Jsp+Tomcat的敬老院管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Jsp+Tomcat的敬老院管理系统设计与实现,文章末尾附有本毕业设计的论文和源 ...
- mysql tomocat vs2005_C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装
要求: JDK.Mysql.Tomcat三者制作成一个安装包, 不能单独安装,安装过程不显示三者的界面, 安装完成要配置好JDK环境.Mysql服务.Tomcat 服务 目的: 解决客户在安装软件的复 ...
- tomcat默认连接数_Tomcat的默认连接器
tomcat默认连接数 Tomcat有几个连接器可供选择. 我将把APR连接器放在一边,而将重点放在BIO和NIO上. BIO连接器(阻塞I / O)正在阻塞–它使用线程池,每个线程在该线程池中接收请 ...
最新文章
- Kubernetes — 安装 Metrics Server
- Linux C动态链接库实现一个插件例子
- 数据的规范化,归一化,标准化,正则化
- sql2005/sql2000 向表中循环插入100万条记录
- SQL Server外连接、内连接、交叉连接
- 一个关于将满足给定条件的数据按顺序写到另一文件中的C语言函数。
- mysql事务四个特性_事务的四个特性
- sql server 快照_添加新文章,删除文章,更改快照文件夹路径和SQL Server复制中的数据筛选器行
- 【C语言】22-枚举
- java可视化工作流_强大的java工作流引擎,可视化开发工作流
- java mina 框架 获取字节_浅谈Java的Mina框架传递对象
- PS透明婚纱抠图(超详细)
- 光猫连接水星路由器显示服务器,水星mw300r路由器连接光猫的设置方法步骤
- 直播平台源码实现网易云音乐样式的字幕
- linux一次三行显示文件内容,Linux 命令合集(二):查看文件及内容处理命令
- RSA加密解密DES加密解密AES
- 上网本 linux中文版,veket|veket linux上网本操作系统 v5.30 简体中文正式版 - 飞极下载站...
- 利用积分区域的对称性计算重积分
- DataStage History
- 阿布扎比将于2023年5月举办年度投资会议
热门文章
- 刷新页面 数组轮播
- 计算机知识产权结合,计算机知识产权.doc
- mysql set 常用参数_mysql常见配置参数
- linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本
- 光纤传感器实验模块_飞秒激光制备异质光纤光栅的温度应变双参数传感器
- 西华大学计算机学院陈鹏,中国计算机学会CCF服务计算专委会走进西华大学
- delphi ascii字符数组_344. 反转字符串
- python机器学习---1. K近邻算法
- 深度学习之生成对抗网络(6)GAN训练难题
- 深度学习(15)TensorFlow高阶操作四: 填充与复制