java实现对服务器的自动巡检邮件通知

1、需求

之前一直是手动的巡检,然后贴图,最近服务器数量大增,有点忙不过来了。因为一直用的java,对shell脚本不是特别了解,所以这次用java写了个小项目,实现对多服务器,多任务的巡检,巡检结果有故障的会通过邮件通知。

2、功能和效果

巡检的项目主要是服务,硬盘,内存等,命令可配置,巡检结果以日期和服务器为基准输出文件,错误信息通过邮件通知管理运维人员。

 

3、代码

action:

复制代码
package com.save.action;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.save.pojo.Cmd;
import com.save.until.MailUtil;
import com.save.until.PropertiesUtil;
import com.save.until.SSHCommUtil;
import com.save.until.WriteUntil;
/**
 * 巡检任务
 * @author zhangzhuo
 *
 */
public class InspAction {
    final static Logger logger = LoggerFactory.getLogger(InspAction.class);
/*    public static void main(String[] args) {
        InspAction n = new InspAction();
        try {
            n.execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.error("dd");
        }
    }*/
    /**
     * 执行巡检任务
     * @param args
     */
    public void execute() throws Exception{
        List<Cmd> list = this.handlerData();
        Set<String> mail = new HashSet<String>();
        for (Cmd cmd : list) {
            String ip = cmd.getIp();
            int port = 22;
            String localIp = null;
            int localPort = 0;
            int timeOut = 6000;
            String userName = cmd.getUsername();
            String password = cmd.getPassword();
            String server = cmd.getServer();
            String[] cmds = cmd.getCmds();
            String[] result = null;
            logger.info(ip+"执行巡检任务开始");
            try {
                result = SSHCommUtil.execShellCmdBySSH(ip, port, localIp, localPort, timeOut,
                        userName, password, cmds);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(ip+"巡检,服务器连接不上");
                mail.add(ip+" "+"巡检,服务器连接不上");
            }
            Date date = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
            String dateString = formatter.format(date);
            //1、服务存活验证 2、硬盘占用验证 3、巡检结果写入文件
            if (result != null) {
                for (String string : result) {
                    if (string.contains("ps -ef|grep java")||string.contains("ps -ef|grep mongo")||string.contains("ps -ef|grep redis")) {
                        if (!string.contains(server)) {
                            mail.add(ip+" "+server+"服务不存在");
                        }
                    }
                    if (string.contains("df -h")) {
                        String patt = "^[5]\\d{1}\\%|[5-9]\\d{1}\\%|\\d{3,}\\%$";
                        String group = null;
                        Pattern p = Pattern.compile(patt);
                        Matcher m = p.matcher(string);
                        while (m.find()) {
                            group = m.group();
                        }
                        if (!StringUtils.isBlank(group)) {
                            mail.add(ip+" "+"硬盘占用超出预警线");
                        }
                    }
                    WriteUntil.createFile("E:\\save", dateString, "\\"+ip+".txt", string);
                }
                logger.info(ip+"巡检结束");
            }
        }
        //发送故障邮件通知
        if (!mail.isEmpty()||mail.size()!=0) {
            MailUtil.getInstance().sendMail(mail);
        }
    }
    /**
     * 数据处理
     * @return
     */
    private List<Cmd> handlerData(){
        logger.info("开始加载需要巡检的服务器数据");
        Cmd cmd = null;
        List<Cmd> list = new ArrayList<Cmd>(); 
        Map map = PropertiesUtil.getInstance().getAllProperty();
        Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> entry = it.next();
            cmd =new Cmd();
            cmd.setIp(entry.getKey());
            Cmd cmd2 = JSON.parseObject(entry.getValue(), Cmd.class);
            String[] cmds = cmd2.getShell().split(",");
            cmd.setCmds(cmds);
            cmd.setServer(cmd2.getServer());
            cmd.setUsername(cmd2.getUsername());
            cmd.setPassword(cmd2.getPassword());
            list.add(cmd);
        }
        logger.info("数据加载完毕");
        return list;
    }

}
复制代码

pojo:

复制代码
package com.save.pojo;

public class Cmd {
    private String ip;
    private String username;
    private String password;
    private String shell;
    private String[] cmds;
    private String server;

    public String getServer() {
        return server;
    }
    public void setServer(String server) {
        this.server = server;
    }
    public String getShell() {
        return shell;
    }
    public void setShell(String shell) {
        this.shell = shell;
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String[] getCmds() {
        return cmds;
    }
    public void setCmds(String[] cmds) {
        this.cmds = cmds;
    }  
}
复制代码

工具类:

复制代码
package com.save.until;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SocketFactory;
/**
 * SSH创建与服务器连接工具类
 * @author 张卓
 * 2017-4-21
 */
public class JSCHUtil {
    final static Logger logger = LoggerFactory.getLogger(JSCHUtil.class);
  private static JSch jsch = new JSch();
  /**
   * 创建Session,并打开Session连接
   * 
   */
  public static Session createSession(String dstIp, int dstPort,
      final String localIp, final int localPort, String userName,
      String password, final int timeOut) throws JSchException {
    //jsch.setKnownHosts("/home/foo/.ssh/known_hosts");
      logger.info("开始连接:"+dstIp);
    // 建立一个SSH连接
    Session session = jsch.getSession(userName, dstIp, dstPort);
    session.setPassword(password);
    
    Prop

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值