小卖铺的老爷爷 通过本文主要向大家介绍了java实现http服务器,java实现web服务器,java实现ftp服务器,ssh服务器 java实现,黏土服务器java下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
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; } }</div>
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; } }</div>
工具类:
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); Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no");//跳过主机检查 session.setConfig(sshConfig); // 此socket工厂用于创建目标主机的socket, // 并创建我们使用的这个socket字节流 session.setSocketFactory(new SocketFactory() { public OutputStream getOutputStream(Socket socket) throws IOException { return socket.getOutputStream(); } public InputStream getInputStream(Socket socket) throws IOException { return socket.getInputStream(); } public Socket createSocket(String host, int port) throws IOException, UnknownHostException { Socket socket = new Socket(); if (localIp != null) { socket.bind(new InetSocketAddress(InetAddress .getByName(localIp), localPort)); } socket.connect( new InetSocketAddress(InetAddress.getByName(host), port), timeOut); return socket; } }); session.connect(timeOut); return session; } }</div>
package com.save.until; import java.util.Properties; import java.util.Set; import javax.mail.