运维经验分享(四)--关于 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

目录
相关文章
|
20天前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
55 1
|
1天前
|
机器学习/深度学习 人工智能 运维
智能化运维:提升IT服务效率的新引擎###
本文深入浅出地探讨了智能化运维(AIOps)如何革新传统IT运维模式,通过大数据、机器学习与自动化技术,实现故障预警、快速定位与处理,从而显著提升IT服务的稳定性和效率。不同于传统运维依赖人工响应,AIOps强调预测性维护与自动化流程,为企业数字化转型提供强有力的支撑。 ###
|
3天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
11 2
|
4天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
8 2
|
20天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
13 1
|
20天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
32 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
23天前
|
Java
如何从Java字节码角度分析问题|8月更文挑战
如何从Java字节码角度分析问题|8月更文挑战
|
29天前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
44 3
|
27天前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
20 1
|
28天前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
29 1

热门文章

最新文章