小卖铺的老爷爷 通过本文主要向大家介绍了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.

