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

运维经验分享作为一个专题,目前共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服务控制脚本第三次优化
时间: 2024-10-20 13:05:31

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

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

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

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

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

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

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

Linux运维经验分享与思路

本文根据讲课笔记整理 1.如何最小化安装系统 精简安装策略: 仅安装需要的,按需安装.不用不装 开发包.基本网络包.基本应用包 Centos6.x下的设置: Centos7.x下的设置: 2.网络设置问题与经验 1).服务器IP地址配置 /etc/sysconfig/network-scripts/ ifcfg-eth0/1/2-. 重启网卡命令: service network restart或者 /etc/init.d/network restart 2).网关/主机名配置 /etc/sys

运维学习第四弹

运维学习第四弹之shell(bash): 一. hell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构.在计算机科学中shell的实际意义为操作者提供的.能够通过系统调用或库调用使用整个计算机资源的访问接口. 它既是一种命令解析器又是一种程序设计语言.作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令:作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支

百万级运维经验一:Mongodb和Redis数据不能放在同一个服务器

一开始时,为了省服务器,把Mongodb和Redis放在一个服务器上.网站每到高峰期都特别卡,还经常出现502.找了很久的原因,发现硬盘的写数据很大,IOPS也很高,排查了很多原因都没找到.然后再仔细研究监控,发现写硬盘的操作很有规律,每隔几分钟就有一次频繁的写硬盘,联想到Redis同步数据到硬盘的间隔就是几分钟,所以开始怀疑是Redis引起的.于是加了一台服务器,把Redis单独放在那里,发现网站瞬间快了,502问题也不再出现了,真是痛苦的经验啊.至于,把Mongodb和Redis放在同一个服

Linux运维 第四阶段 (六)MySQL备份&&还原(mysqldump、LV’s snapshot、xtrabackup)

Linux运维 第四阶段 (六)MySQL备份&&还原(mysqldump.LV's snapshot.xtrabackup) 一.相关概念 备份:副本,mysql-database备份不同于RAID(RAID是保证硬件损坏而不会业务终止) 备份内容:数据.配置文件.二进制日志.事务日志 1.备份类型: >热备份.温备份.冷备份 热备份:读写不受影响,复杂度高,InnoDB(xtrabackup,mysqldump),lvm快照功能可实现几乎热备: 温备份:仅可执行读操作,MyISA

Linux运维 第二阶段 (四)用户管理

Linux运维第二阶段(四)用户管理 一.相关文件 >/etc/passwd                  用户信息文件 root:x:0:0:root:/root:bin/bash(以下依次为第1到第7字段) 1.用户名 2.密码标记 3.uid:超级用户root的uid为0,普通用户要升级为管理员,uid改为0即可(不建议建立多个管理员账号:1-499系统用户uid(伪用户),不能登录系统,用来运行系统或服务的,其中1-99是系统保留的账号,自动创建,100-499是预留给用户创建系统账

运维百科,分享运维过程中的精华

运维百科 是由多名IDC机房资深运维共同建设的一个基于互联网传播的运维知识分享平台,分享运维过程中的精华,记录运维人点滴生活.   感兴趣的朋友,可以打开www.idcyunwei.org了解! 运维百科,分享运维过程中的精华,布布扣,bubuko.com