java 监控linux服务器cpu、内存、java进程是否存活,发现异常发送邮件提醒

前一段时间在维护一个N年前的项目,这个项目有十几个服务器,每个服务器上有十几个服务。接手后的几个星期天天有事,要不就是服务挂了导致没有数据,要不就是把服务器跑宕机了。因为是老项目,所以不敢有大的动作,只能写一个简单的检测程序,检测一下服务器状态,cpu使用率,磁盘使用率,进程是否存在。程序不复杂,但是解放了自己。现在把这个小工具整理一下分享出来,希望可以帮到有需要的人。
我使用的是qq的发送邮箱,首先要开启QQ邮箱需获取相应的权限,
开启位置:QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
话不多说直接上代码

package com.yyq;import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;/*** * @author 杨永琪* @date 2021年8月16日*/
public class CheckJava {/*** 邮箱*/public static final String EMAIL = "XXXXXXX@qq.com";/*** 密码*/public static final String EMAIL_PWD = "XXXXXXX";/*** 接受邮件的邮箱*/public static final String RECIPIENT = "XXXXXXX@qq.com";public static void main(String[] args) {String jarName = "res_compare.jar";//查看程序进程号String process = checkJava(jarName);//查看磁盘使用率checkDisk();//查看总进程使用数量checkPid();if(null == process){return;}//查看进程cpu使用率checkCPU(process);//查看进程内存使用率checkMEM(process);}/*** 检查指定的java进程是否存在 * @param jarName  jar包名称* @return 进程号*/public static String checkJava(String jarName){String checkJavaCmd =String.format("ps -ef | grep %s | grep -v grep | awk '{print $2}'|xargs",jarName);String result = MyRuntimeExec.exec(checkJavaCmd);System.out.println("当前程序 "+jarName+" 进程号是:"+result);if(null == result || "".equals(result) || " ".equals(result)){sendMail(EMAIL, EMAIL_PWD, RECIPIENT, jarName+"服务挂了",String.format("主人,您的服务挂啦(%s),赶快处理呀!",jarName));return null;}return result.trim();}/*** 检查 cpu是否超过阈值* @param process  进程号*/public static void checkCPU(String process){int cpuMax = 350;//cpu阈值String cpuCmd = String.format("top -b -n 1 | grep %s | awk '{print int($9)}'",process);String cpuResult = MyRuntimeExec.exec(cpuCmd);cpuResult = cpuResult.trim();Integer cpu = Integer.valueOf(cpuResult);System.out.println("当前程序 "+process+" cpu使用率是:"+cpu);if(cpu > cpuMax){sendMail(EMAIL, EMAIL_PWD, RECIPIENT, "cpu超过阈值了",String.format("主人,您的服务cpu爆表啦(%s)现在cpu是:%s,赶快处理呀!",process,cpuResult));}}/*** 检查 内存是否超过阈值* @param process  进程号*/public static void checkMEM(String process){int memMax = 50;//内存阈值String memCmd = String.format("top -b -n 1 | grep %s | awk '{print int($10)}'",process);String memResult = MyRuntimeExec.exec(memCmd);memResult = memResult.trim();Integer mem = Integer.valueOf(memResult);System.out.println("当前程序 "+process+" 内存使用率是:"+mem);if(mem > memMax){sendMail(EMAIL, EMAIL_PWD, RECIPIENT, "内存超过阈值了",String.format("主人,您的服务内存爆表啦(%s)现在内存是:%s,赶快处理呀!",process,memResult));}}/*** 检查linux 磁盘空间是否超过阈值*/public static void checkDisk(){int diskMax = 90;//磁盘使用阈值(百分比)String diskCmd = "df -h|head -2| awk '{print int($5)}'|xargs";String diskResult = MyRuntimeExec.exec(diskCmd);String useageStr = diskResult.split(" ")[1];Integer usage = Integer.valueOf(useageStr.trim());System.out.println("当前系统磁盘使用率是:"+usage);if(usage > diskMax){sendMail(EMAIL, EMAIL_PWD, RECIPIENT, "磁盘超过阈值了",String.format("主人,您的磁盘快使用完啦,现在使用率是:%s,赶快处理呀!",useageStr));}}/*** 检查linux进程数量是否超过阈值*/public static void checkPid(){int pidMax = 5000;//进程数量阈值String pidCmd = "pstree -p|wc -l";String pidResult = MyRuntimeExec.exec(pidCmd);Integer pids = Integer.valueOf(pidResult.trim());System.out.println("当前系统进程使用数量是:"+pids);if(pids > pidMax){sendMail(EMAIL, EMAIL_PWD, RECIPIENT, "进程数超过阈值了",String.format("主人,您的进程数超过阈值啦,现在是:%s,赶快处理呀!",pidResult));}}/*** * @param sender        寄件人* @param senderPwd      寄件人密码* @param recipient    收件人* @param text       内容* @param title           标题* @return*/public static boolean sendMail(String sender, String senderPwd, String recipient, String text, String title) {try {final Properties props = new Properties();props.put("mail.smtp.auth", "true");props.put("mail.smtp.host", "smtp.qq.com");// 发件人的账号props.put("mail.user", sender);// 发件人的密码props.put("mail.password", senderPwd);// 构建授权信息,用于进行SMTP进行身份验证Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用环境属性和授权信息,创建邮件会话Session mailSession = Session.getInstance(props, authenticator);// 创建邮件消息MimeMessage message = new MimeMessage(mailSession);// 设置发件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 设置收件人InternetAddress toAddress = new InternetAddress(recipient);message.setRecipient(Message.RecipientType.TO, toAddress);// 设置邮件标题message.setSubject(title);// 设置邮件的内容体message.setContent(text, "text/html;charset=UTF-8");// 发送邮件Transport.send(message);System.out.println("给" + recipient + "发送邮件成功");return true;} catch (Exception e) {System.out.println("给" + recipient + "发送邮件失败,错误:" + e.getMessage());e.printStackTrace();}return false;}}

执行linux命令并解析的工具类

package com.yyq;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;/*** * @author 杨永琪* @date 2021年5月9日*/
public class MyRuntimeExec {private static String DEFAULTCHART = "UTF-8";public static String exec(String cm){String os = System.getProperty("os.name").toLowerCase();Process ps = null;InputStream er = null;InputStream is = null;String result = null;try {if(os.contains("win")){String[] cmd = { "cmd", "/c", cm };ps = Runtime.getRuntime().exec(cmd);}else if (os.contains("linux")){if(cm.contains("rm ")){System.err.println("不能执行危险命令"+cm);return result;}if(cm.contains("mv ")){System.err.println("不能执行危险命令"+cm);return result;}String[] cmd = { "/bin/sh", "-c", cm };ps = Runtime.getRuntime().exec(cmd);}is = ps.getInputStream();result = getInString(is);
//          System.err.println("执行命令:"+cm+" 执行结果--<"+result+" >--");} catch (Exception e) {System.err.println(e.getMessage());} finally {try {if (null != ps)ps.waitFor();if (null != is)is.close();if (null != er)er.close();if (null != ps)ps.destroy();} catch (Exception e) {System.err.println(e.getMessage());e.printStackTrace();}}return result;}public static String execEnter(String cm){String os = System.getProperty("os.name").toLowerCase();Process ps = null;InputStream er = null;InputStream is = null;String result = null;try {if(os.contains("win")){String[] cmd = { "cmd", "/c", cm };ps = Runtime.getRuntime().exec(cmd);}else if (os.contains("linux")){String[] cmd = { "/bin/sh", "-c", cm };ps = Runtime.getRuntime().exec(cmd);}is = ps.getInputStream();result = getInStringEnter(is);System.err.println("执行命令:"+cm+" 执行结果--<"+result+" >--");} catch (Exception e) {System.err.println(e.getMessage());} finally {try {if (null != ps)ps.waitFor();if (null != is)is.close();if (null != er)er.close();if (null != ps)ps.destroy();} catch (Exception e) {System.err.println(e.getMessage());e.printStackTrace();}}return result;}public static String getInString(InputStream is) throws Exception{StringBuffer result = new StringBuffer();BufferedReader reader = new BufferedReader(new InputStreamReader(is,DEFAULTCHART));String line;while ((line = reader.readLine()) != null) {result.append(line + " ");}return result.toString();}public static String getInStringEnter(InputStream is) throws Exception{StringBuffer result = new StringBuffer();BufferedReader reader = new BufferedReader(new InputStreamReader(is,DEFAULTCHART));String line;while ((line = reader.readLine()) != null) {result.append(line + "\n");}return result.toString();}
}

效果

用到的jar包
javax.mail-api-1.5.5.jar
javax.mail-1.5.5.jar

maven依赖

<dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version>
</dependency>
<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.5.5</version>
</dependency>

java 监控linux服务器cpu使用率、内存使用率、磁盘使用率、java进程是否存活等服务相关推荐

  1. Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本

    [本文出自天外归云的博客园] 网上搜,东拼西凑,组装了一个可以查Linux服务器CPU使用率.内存使用率.磁盘空间占用率.负载情况的python脚本. 脚本内容如下: # -*- coding:utf ...

  2. php获取linux服务器CPU、内存、硬盘使用率的实现代码

    define("MONITORED_IP", "172.16.0.191"); //被监控的服务器IP地址 也就是本机地址 define("DB_SE ...

  3. Java获取linux服务器cpu、内存、硬盘相关信息

    需要用到jcraft依赖,如果依赖失效,请前往官方获取jcraft官网,maven地址https://search.maven.org/artifact/com.jcraft/jsch <dep ...

  4. Linux监控CPU关闭服务器,监控Linux服务器CPU和内存

    利用脚本获取Linux服务器的CPU和内存. 需要安装bc计算器 yum install -y bc 创建执行脚本 计算CPU利用率,配置了5秒采样. 执行脚本,5秒后输出采集日期|CPU负载|可用内 ...

  5. Windows获取CPU、内存和磁盘使用率脚本

    获取CPU使用率脚本(vbs),另存为cpu.vbs: On Error Resume Next Set objProc = GetObject("winmgmts:\\.\root\cim ...

  6. linux cpu 内存爆满 mysql停止_如何用脚本统计linux系统CPU、内存、磁盘IO等信息?...

    概述 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. 脚本 #!/bin/bash# 获取要监控的本地服务器IP地址IP=`ifconfig | grep ine ...

  7. Linux按照CPU、内存、磁盘IO、网络性能监测

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  8. Linux小知识---利用Snmp远程获取CPU,内存和磁盘使用率

    知识点回顾 <网络协议学习-SNMP> 前面写了一篇Snmp协议的知识点文章,今天要利用这些知识点,再加一些shell编程知识点,实现一个利用shell脚本,远程获取某个Agent的CPU ...

  9. python glances来监控linux服务器CPU 内存 IO使用

    什么是 Glances? Glances 是一个由 Python 编写,使用 psutil 库来从系统抓取信息的基于 curses 开发的跨平台命令行系统监视工具. 通过 Glances,我们可以监视 ...

最新文章

  1. Docker实战(一)之使用Docker镜像
  2. DB2性能调节工作总结
  3. endnote一打开就自动关闭_【EndNote文献管理】5分钟快速上手Endnote
  4. android viewpager 详解,详解Android App中ViewPager使用PagerAdapter的方法
  5. 如何有效练肩部肌肉增加肩宽并且避免斜方肌发达呢?
  6. php yii2模块,Yii2 之 frontend 子模块实践之四:路由美化
  7. Redis--位图BitMap
  8. arduino串口监视器显示nan_Arduino常用的三种通信协议UART, I2C和SPI
  9. 自己搭建了一个简单实用的Web版记事本
  10. 特殊域名后缀如何申请备案?
  11. wingftpserver完整配置免费ftp站点(指南)
  12. HP刀片服务器系统Flex,HP刀片服务器系统Flex-10 VC配置与VMware vSphere网络设计
  13. 穿越火线老是卡在正在连接服务器,修复cf经常提示网络出现异常与服务器断开连接的方法...
  14. 树莓派CM4六路串口设置及使用
  15. 802.11n和802.11ac的MCS速率表
  16. 可维护性、可复用性和可扩展性的区别
  17. 为什么你觉得信用卡负担越来越重了?那是你不会技巧!
  18. 3个图片去水印工具,干干净净去水印,每一个都是自留
  19. 东北师范大学计算机研究生拟录取名单,2020东北师范大学硕士研究生复试成绩和拟录取名单合集...
  20. zynq 7000 sdk下裸机can(ps/pl) 调试

热门文章

  1. 拆解碧桂园2021投资版图,是主动“扩张”还是被动“焦虑”?
  2. Android经典蓝牙相关知识
  3. The Black Tux | IT桔子
  4. 通过if分支结构计算个人所得税
  5. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第三周作业 - 机器翻译与触发词检测
  6. 前端轮播插件banner
  7. 设置视频(Video)模式
  8. AI创业有风险,起步需谨慎!创业者从准备到失败~
  9. 【教学类-34-01】拼图(运动项目-长方块拼图)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)
  10. Watch App简介