运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dgd2010.blog.51cto.com/1539422/1677155

运维经验分享作为一个专题,目前共7篇文章

  1. 运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本

  2. 运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

  3. 运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)

  4. 运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

  5. 运维经验分享(五)-- 改进的java进程管理的服务控制脚本

  6. 运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)

  7. 运维经验分享(七)-- Linux Shell之ChatterServer服务控制脚本第三次优化

====================================分割线======================================

ChatterServer 之所以有如此多版和遇到这么多问题,跟java进程还有很大的关系,此次面临的问题和分析思路总结如下,欢迎各位补充。

停止java进程可能面临的问题:

  1. 以kill pid的方式停止java进程,java进程在等待java进程内部结束,因此没有立即结束,从而导致原java程序监听的端口可能没有释放,原java进程的pid也可能依然存在

  2. 在原java进程没有立即结束的情况下,再重新启动这个java进程就会产生错误,这些错误包括无法重新监听端口,甚至是直接启动失败

  3. 启动java进程可能面临的问题:

  4. 用java命令启动java进程,java进程返回结果为成功,但实际不成功(需要注意确认“用java命令启动java进程”返回的执行结果是java自身返回的,还是人工编写的程序返回的)

上面描述的一些进一步解释、术语和例子:

  1. java进程是指由人工编写的一些java程序,其中不能保证程序里面的异常全部捕获并处理,例如如果无法监听端口返回正确的错误返回值并退出

  2. 以kill pid的方式:kill `cat $PIDFILE`

  3. 用java命令启动java进程:java -jar somename.jar $ARGS

原有的启动java进程的流程

  1. 启动进程有两种情况,第一次启动(首次启动),停止进程后再次启动(重新启动),因此可以考虑将这两种情况综合在一起考虑,即不区分之前是否启动过或停止过,把这些情况都考虑进去

  2. 判断当前系统中的特定目录下是否存在pid文件或者锁

  3. 判断当前系统中是否已经存在java进程,判断的依据是从系统中检测java进程pid是否存在,如ps,而不是根据pid文件或者锁判断

  4. 判断当前系统中是否已经监听端口号,因为端口号可能由别的程序(如果pid不存在,则该端口号不会由它自己占用)占用

  5. 启动java进程(大部分程序都会保证此处能启动成功,可参考/etc/init.d/functions,行270,1-8),如果返回结果为成功,则输出成功并创建pid文件和锁,如果不成功,则输出不成功,不再尝试再次启动

原有的停止java进程的流程

  1. 如果找到pid,先发送TERM信号,暂停100000微秒(usleep 100000),如果人工预先知道需要继续延迟,则延迟自定义秒数,如果没有杀死(即依然能检测到系统中存在此pid)则再发送KILL信号,再次暂停100000微秒

  2. 再次检测到系统中是否存在此pid,如果不存在则输出成功并移除pid文件和锁,如果存在则输出不成功

  3. 如果找不到pid,则输出程序没有在运行

根据以上问题重新设计启动java进程的流程(主要问题所在)

  1. 启动进程有两种情况,第一次启动(首次启动),停止进程后再次启动(重新启动),因此可以考虑将这两种情况综合在一起考虑,即不区分之前是否启动过或停止过,把这些情况都考虑进去

  2. 判断当前系统中的特定目录下是否存在pid文件(原有设计中没有锁,故此处不使用锁)

  3. 判断当前系统中是否已经存在java进程,判断的依据是从系统中检测java进程pid是否存在,如test -d /proc/$pid,ps,而不是根据pid文件或者锁判断

  4. 判断当前系统中是否已经监听端口号,因为端口号可能由别的程序(如果pid不存在,则该端口号不会由它自己占用)占用

  5. 启动java进程(大部分程序都会保证此处能启动成功,可参考/etc/init.d/functions,行270,1-8),如果返回结果为成功,从系统中检测java进程pid是否存在,如果pid存在则输出成功并创建pid文件(原有设计中没有锁,故此处不使用锁),如果pid不存在,则再次启动java进程,移除“如果不成功,则输出不成功,不再尝试再次启动”。

根据以上问题重新设计停止java进程的流程

  1. 针对java进程没有杀死的可能性,现做出如此修改,如果找到pid,先发送TERM信号,暂停100000微秒(usleep 100000),已经预先知道需要继续延迟,延迟5秒,如果没有杀死(即依然能检测到系统中存在此pid)则再发送KILL信号,再次暂停100000微秒

  2. 再次检测到系统中是否存在此pid,如果不存在则输出成功并移除pid文件(原有设计中没有锁,故此处不使用锁),如果pid依然存在则再尝试kill -9(The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.当前假设认为-9比kill更加强制)

  3. 如果找不到pid,则输出程序没有在运行

--end--

====================================分割线======================================

运维经验分享作为一个专题,目前共7篇文章

  1. 运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本

  2. 运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

  3. 运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)

  4. 运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

  5. 运维经验分享(五)-- 改进的java进程管理的服务控制脚本

  6. 运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)

  7. 运维经验分享(七)-- Linux Shell之ChatterServer服务控制脚本第三次优化

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1677155

目录
相关文章
|
8月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
254 4
|
8月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
6月前
|
JSON Java 数据格式
java调用服务报错400
java调用服务报错400
178 6
java调用服务报错400
|
6月前
|
JSON Java 数据格式
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
397 6
|
6月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
326 2
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
324 1
|
6月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
299 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
325 1
|
7月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
8月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。