Java|Linux系统下Java通过shell脚本监控重启服务

文章图片

文章图片

简介最近运维人员提出需求 , 增加一个运维页面 ,查询当前的业务进程信息包括:进程名称、启动命令、启动时间、运行时间等 , 可以通过页面点击重启按钮 , 可以重启后端的一系列系统进程 。
思路java程序获取linux进程信息可以通过shell脚本获取进程信息、通过读取proc文件系统获取进程信息 。但是为了系统的安全性、方便维护等角度出发 , 更多的是java通过shell获取和linux交互能力 。
java程序中要执行linux命令主要依赖2个类:Process和Runtime:
Process:
ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程 , 并返回 Process 子类的一个实例 ,该实例可用来控制进程并获得相关信息 。 Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、 检查进程的退出状态以及销毁(杀掉)进程的方法 。创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作 , 比如 , 本机窗口进程 , 守护进程 , Microsoft Windows 上的 Win16/DOS 进程 , 或者 shell 脚本 。 创建的子进程没有自己的终端或控制台 。 它的所有标准 io(即 stdin、stdout 和 stderr) 操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程 。父进程使用这些流来提供到子进程的输入和获得从子进程的输出 。 因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小 ,如果读写子进程的输出流或输入流迅速出现失败 , 则可能导致子进程阻塞 , 甚至产生死锁 。当没有 Process 对象的更多引用时 , 不是删掉子进程 , 而是继续异步执行子进程 。对于带有 Process 对象的 Java 进程 , 没有必要异步或并发执行由 Process 对象表示的进程 。
- 特别需要注意的是:
(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程(父进程可通过这些流判断子进程的执行情况)
2 , 因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小 , 如果读写子进程的输出流或输入流迅速出现失败 ,
则可能导致子进程阻塞 , 甚至产生死锁
特别需要注意:如果子进程中的输入流 , 输出流或错误流中的内容比较多 , 最好使用缓存(注意上面的情况2)
Runtime
【Java|Linux系统下Java通过shell脚本监控重启服务】每个Java应用程序都有一个Runtime类实例 , 使应用程序能够与其运行的环境相连接 。 可以通过getRuntime方法获取当前运行时环境 。应用程序不能创建自己的Runtime类实例 。
获取进程信息
- 获取进程的shell字符串 ps aux | grep procName| grep -v grep
查询所需的进程列表信息
重启业务进程为了解决在某个进程启动失败的时候 , web端可以获取到该进程的信息 ,需要通过shell返回一个int值 ,每个进程启动结果占用1个bit位方式实现 , web端获取结果后 , 解决返回的结果 , 然后判断是否有进程启动失败 。
首先准备好shell脚本 , 内容如下:
推荐阅读
- 系统性红斑狼疮|盘点:系统性红斑狼疮治疗药物研发进展
- 系统性红斑狼疮|荣昌生物泰它西普获批,60年来第二款系统性红斑狼疮新药
- 南美白对虾|南美白对虾混养各种鱼,生态系统稳定,养殖成功率提升明显
- 生态系统|研究揭示荒漠生态系统对气候变化响应
- 人工智能|人工智能系统一秒内算出震源机制参数
- 微生物|微生物分泌系统【T6SS】知识介绍
- 迎角|高速直升机的旋翼系统设计为什么比较难?复杂的涡运动了解一下
- 王爱勇|王爱勇:非瘟“双毒”夹击,如何应对?系统防控是关键!
- 系统性红斑狼疮|解药|国产系统性红斑狼疮创新药首获批 新在哪里?
- 植物神经系统|一个困扰患者7年的疾病,药没少吃,病却没好!
