之前在网上看过一篇文章,是讲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意外宕机分析相关推荐

  1. java获取tomcat目录结构_Tomcat目录结构详解

    Tomcat目录结构图如下: bin目录 存放一些可执行的二进制文件,.sh结尾的为linux下执行命令,.bat结尾的为windows下执行命令. catalina.sh:真正启动tomcat文件, ...

  2. java获取tomcat目录结构_tomcat目录结构简介_动力节点Java学院整理

    tomcat目录结构简介 如果我们有一个web应用,名称为"mail"(同时也是web应用所在目录的名称),那么其目录内不同类型的文件应该服从如下放置的规则: 一般来讲: 对于ht ...

  3. java打印tomcat内存溢出_tomcat内存溢出问题监控工具

    针对杭州数字电视系统内存溢出的问题,对tomcat做了两种监控方式. 注:以下配置都配置到catalina.sh文件中. 一.gclog,这种方式用于观察内存回收情况,显示的内容如下所示: 21184 ...

  4. Java内存泄漏、性能优化、宕机死锁的N种姿势

    导读 本文介绍Java诸多优化实例:第一,排查堆上.堆外内存泄露:第二,使用arthas.jaeger.tcpdump.jstack做性能优化:第三,排查进程异常退出的原因,如被杀.System.ex ...

  5. 网站服务器宕机怎么办,服务器宕机了该怎么办?

    原标题:服务器宕机了该怎么办? 导读 如果Web服务器已经虚拟化,试着ping物理服务器自己的真实IP.这样可以帮助你进一步隔离问题.如果完全无法ping同服务器,而且也已经确定完全检查了网络连接,那 ...

  6. Facebook史上最严重宕机,全网宕机近七小时,到底是怎么回事?

    Facebook史上最严重宕机,全网宕机近七小时,高管赴推特道歉.近7个小时时间,全都挂了Facebook全网宕机,连内网都废了.Twitter成为了最大赢家.对一家互联网巨头来说,这样的状况实在太尴 ...

  7. java毕业设计——基于java+Jsp+Tomcat的敬老院管理系统设计与实现(毕业论文+程序源码)——敬老院管理系统

    基于java+Jsp+Tomcat的敬老院管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Jsp+Tomcat的敬老院管理系统设计与实现,文章末尾附有本毕业设计的论文和源 ...

  8. mysql tomocat vs2005_C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装

    要求: JDK.Mysql.Tomcat三者制作成一个安装包, 不能单独安装,安装过程不显示三者的界面, 安装完成要配置好JDK环境.Mysql服务.Tomcat 服务 目的: 解决客户在安装软件的复 ...

  9. tomcat默认连接数_Tomcat的默认连接器

    tomcat默认连接数 Tomcat有几个连接器可供选择. 我将把APR连接器放在一边,而将重点放在BIO和NIO上. BIO连接器(阻塞I / O)正在阻塞–它使用线程池,每个线程在该线程池中接收请 ...

最新文章

  1. Kubernetes — 安装 Metrics Server
  2. Linux C动态链接库实现一个插件例子
  3. 数据的规范化,归一化,标准化,正则化
  4. sql2005/sql2000 向表中循环插入100万条记录
  5. SQL Server外连接、内连接、交叉连接
  6. 一个关于将满足给定条件的数据按顺序写到另一文件中的C语言函数。
  7. mysql事务四个特性_事务的四个特性
  8. sql server 快照_添加新文章,删除文章,更改快照文件夹路径和SQL Server复制中的数据筛选器行
  9. 【C语言】22-枚举
  10. java可视化工作流_强大的java工作流引擎,可视化开发工作流
  11. java mina 框架 获取字节_浅谈Java的Mina框架传递对象
  12. PS透明婚纱抠图(超详细)
  13. 光猫连接水星路由器显示服务器,水星mw300r路由器连接光猫的设置方法步骤
  14. 直播平台源码实现网易云音乐样式的字幕
  15. linux一次三行显示文件内容,Linux 命令合集(二):查看文件及内容处理命令
  16. RSA加密解密DES加密解密AES
  17. 上网本 linux中文版,veket|veket linux上网本操作系统 v5.30 简体中文正式版 - 飞极下载站...
  18. 利用积分区域的对称性计算重积分
  19. DataStage History
  20. 阿布扎比将于2023年5月举办年度投资会议

热门文章

  1. 刷新页面 数组轮播
  2. 计算机知识产权结合,计算机知识产权.doc
  3. mysql set 常用参数_mysql常见配置参数
  4. linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本
  5. 光纤传感器实验模块_飞秒激光制备异质光纤光栅的温度应变双参数传感器
  6. 西华大学计算机学院陈鹏,中国计算机学会CCF服务计算专委会走进西华大学
  7. delphi ascii字符数组_344. 反转字符串
  8. python机器学习---1. K近邻算法
  9. 深度学习之生成对抗网络(6)GAN训练难题
  10. 深度学习(15)TensorFlow高阶操作四: 填充与复制