Linux 端tomcat监控程序(JAVA版)



1.一个判断服务是否启动的监控类

package com.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RequestUtil {
	/**
	 * 网站是否正常运转
	 * @return
	 */
	public static boolean isWebSiteNormal(String urlStr){
		try {
			if(urlStr != null && urlStr.indexOf("://") <= 0 ){
				urlStr = "http://"+urlStr;
			}
			URL url = new URL(urlStr);
			URLConnection con = url.openConnection();
			BufferedReader in = new BufferedReader(new java.io.InputStreamReader(con
					.getInputStream()));
			con.setConnectTimeout(2000);
			con.setReadTimeout(6000);
			String s = "";
			while ((s = in.readLine()) != null) {
				if (s.length() > 0) {
					return true;
				}
			}
			in.close();
		} catch (Exception e) {
			LogUtil.writerE(e);
		}
		return false;
	}
	
	/**
	 * 查看Tomcat7服务是否正在运行
	 * @return
	 */
	public static boolean isTomcatServiceAlive(){
		try {
			Process process = Runtime.getRuntime().exec("lsof -i tcp:80");
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null) {
				if(line != null && !"".equals(line)){
					return true;
				}       
			}        
		} catch (java.io.IOException e) {     
			LogUtil.writerE(e);
		}
		return false;
	}
	
	/**
	 * 获取tomcat监听的进程
	 * @return
	 */
	public static String getTomcatTcpIpListener(){
		StringBuffer str = new StringBuffer();
		try {
			Process process = Runtime.getRuntime().exec("lsof -i tcp:80");
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null) {
				if(line != null && !"".equals(line)){
					str.append(line).append("\n");
				}       
			}        
		} catch (java.io.IOException e) {
			LogUtil.writerE(e);
		}
		return str.toString();
	}
	
	/**
	 * 获取tomcat监听的进程
	 * @param content
	 * @return
	 */
	public static Set<Integer> getUids(String content){
		Pattern pattern = Pattern.compile("java\\s*[0-9]*");
		Matcher matcher = pattern.matcher(content);
		Pattern pattern2 = Pattern.compile("[0-9]+");
		Set<Integer> uidSet = new HashSet<Integer>();
		while(matcher.find()){
			Matcher matcher2 = pattern2.matcher(matcher.group());
			if(matcher2.find()){
				if(matcher2.group() != null && !"".equals(matcher2.group())){
					uidSet.add(Integer.parseInt(matcher2.group()));
				}
					
			}
		}
		return uidSet;
	}
	
	public static boolean isWebCanVisite(String url) {
		if(url != null && url.lastIndexOf("://") <= 0 ){
			url = "http://"+url;
		}
		LogUtil.writerINF("Check Url:"+url);
		String content = HttpRequestProxy.doGet(url,"utf-8");
//		Pattern pattern = Pattern.compile("<title>\\s*[^<>][^<>]*\\s*</title>");
//		Pattern pattern2 = Pattern.compile("[^x00-xff]*");
		if(content != null){
			return true;
//			Matcher matcher = pattern.matcher(content);
//			String temp = "";
//			while(matcher.find()){
//				temp = matcher.group();
//				temp = temp.trim();
//				if(temp.length() > 16){
//					temp = temp.substring(7, temp.length()-8);
//					Matcher matcher2=pattern2.matcher(temp);
//					if(matcher2.find()){
//						return true;
//					}
//				}
//			}
				
		}
		return false;
	}
	
	
}



 2.一个Tomcat服务控制工具类

package com.util;

import java.util.Iterator;
import java.util.Set;

public class TomcatUtil {

	/**
	 * 关闭tomcat7服务
	 * @return
	 */
	public static boolean stopTomcat() {
		try {
			String commandstr = "/usr/local/tomcat7/bin/shutdown.sh";
			Process p;
			LogUtil.writerINF("Tomcat7 ShutDown");
			p = Runtime.getRuntime().exec(commandstr);
			if (p.waitFor() == 0){
				LogUtil.writerINF("Tomcat7 ShutDown over");
				return true;
			}else{
				LogUtil.writerINF("Tomcat7 ShutDown fail");
				return false;
			}
		} catch (Exception e) {
			LogUtil.writerINF("Tomcat7 ShutDown fail");
			LogUtil.writerE(e);
			return false;
		}
	}
	
	/**
	 * 开启服务
	 * @return
	 */
	public static boolean startTomcat() {
		try {
			String commandstr = "/usr/local/tomcat7/bin/startup.sh";
			Process p;
			LogUtil.writerINF("Tomcat7 startup");
			p = Runtime.getRuntime().exec(commandstr);
			if (p.waitFor() == 0){
				LogUtil.writerINF("Tomcat7 startup over");
				return true;
			}else{
				LogUtil.writerINF("Tomcat7 startup fail");
				return false;
			}
		} catch (Exception e) {
			LogUtil.writerINF("Tomcat7 startup fail");
			LogUtil.writerE(e);
			return false;
		}
	}
	
	/**
	 * 杀掉进程
	 * @param uidSet
	 * @return
	 */
	public static int killUid(Set<Integer> uidSet){
		Iterator<Integer> it = uidSet.iterator();
		int successCount = 0 ;
		while(it.hasNext()){
			int uid = it.next();
			try {
				String commondStr = "kill -9 "+uid;
				Process p = Runtime.getRuntime().exec(commondStr);
				if (p.waitFor() == 0){
					LogUtil.writerINF("java "+uid+" be Killed");
					successCount ++;
				}else{
					LogUtil.writerINF("java "+uid+" be Kill Failed");
				}
			} catch (Exception e) {
				LogUtil.writerE(e);
			}
		}
		return successCount;
	}
	
}


3.Email发送工具类

package com.util;

import java.util.ArrayList;
import java.util.List;
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;
import javax.mail.internet.MimeUtility;
import javax.mail.internet.MimeMessage.RecipientType;

/**
 * MailUtil
 * @author Administrator
 *
 */
public class MailUtils {
	

	private String MAIL_NAME = "****";
	private String MAIL_PASSWORD =  "******";
	private String mailHost = "smtp.163.com";
	private String MAIL_FROM = "******@163.com";
	private String MAIL_FROM_NAME = "****";
	
	public MailUtils(){
		
	}
	
	public MailUtils(String username,String password,String mailHost,String mailFrom,String mailFromName ){
		this.MAIL_NAME = username;
		this.MAIL_PASSWORD =  password;
		this.mailHost  =  mailHost;
		this.MAIL_FROM = mailFrom;
		this.MAIL_FROM_NAME = mailFromName;
	}
	
	
	/**
	 * 邮箱认证
	 * @param userAuth
	 * @param mailType
	 * @return
	 * @throws Exception
	 */
	public Session mailAuth() throws Exception{
		Properties props = new Properties();
		props.setProperty("mail.smtp.auth", "true");
		props.setProperty("mail.transport.protocol", "true");
		props.setProperty("mail.host", mailHost);
		Session session = Session.getDefaultInstance(props,new Authenticator(){

			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return  new PasswordAuthentication(MAIL_NAME,MAIL_PASSWORD);
			}
			
		});
		return session;
	}
	
	/**
	 * @param subject
	 * @param content
	 * @param mailTo
	 * @throws Exception
	 */
	public  void sendSimpleMail(String subject,String content,String mailTo) throws Exception{
		Session session = mailAuth();
		session.setDebug(true);
		Message msg = new MimeMessage(session);
		msg.setFrom(new InternetAddress(MimeUtility.encodeText(MAIL_FROM_NAME)+"<"+MAIL_FROM+">" ));
		msg.setSubject(subject);
		msg.setText(content);
		msg.addRecipient( RecipientType.TO, new InternetAddress(mailTo));
		Transport.send(msg);
	}
	
	public void sendMutilHtmlMail(String subject,String content,List<String> mailto) throws Exception{
		if(mailto != null){
			for(int i = 0 ; i < mailto.size() ; i++){
				sendHtmlMail(subject, content,mailto.get(i));
				
			}
		}
	}		
}

4.生成日志工具类

package com.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LogUtil {
	
	private static String FILE_PATH = "/usr/local/tomcatLook/";
	
	public static void writerINF(String info){
		File file = null;
		File filedir = null;
		BufferedWriter writer = null;
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat sdf2 = new SimpleDateFormat("MM-dd_HH:mm:ss");
		try {
			filedir = new File(FILE_PATH);
			if(!filedir.exists()){
				filedir.mkdirs();
			}
			file = new File(FILE_PATH+"domain."+sdf.format(date)+".log");
			if(file.exists()){
				file.createNewFile();
			}
			writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
			writer.write("["+sdf2.format(date)+"]-[INFO]:"+info+"\n");
			writer.flush();
		} catch (IOException e) {
		} finally{
			if(writer != null){
				try {
					writer.close();
				} catch (IOException e) {
				}
			}
			writer = null;
			file = null;
			filedir = null;
			date = null;
			sdf = null;
			sdf2 = null;
		}
	}
	
	public static void writerE(Exception e){
		StringBuffer info = new StringBuffer();
		File file = null;
		File filedir = null;
		BufferedWriter writer = null;
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat sdf2 = new SimpleDateFormat("MM-dd_HH:mm:ss");
		try {
			info.append("[").append(sdf2.format(date)).append("]-[Exception]:").append(e.getClass().getName()).append("\n\t").append(getExceptionString(e)).append("\n");
			filedir = new File(FILE_PATH);
			if(!filedir.exists()){
				filedir.mkdirs();
			}
			file = new File(FILE_PATH+"domain."+sdf.format(date)+".log");
			if(file.exists()){
				file.createNewFile();
			}
			writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
			writer.write(info.toString());
			writer.flush();
		} catch (IOException ioe) {
		} finally{
			if(writer != null){
				try {
					writer.close();
				} catch (IOException ioe2) {
				}
			}
			writer = null;
			file = null;
			filedir = null;
			date = null;
			sdf = null;
		}
	}
	
	
	/**
     * 返回处理后的异常信息
     * @param e 异常对象
     * @return  处理后的异常信息
     */
    private static String getExceptionString(Exception e) {
    	String errorString = e.toString() + "\r\n";
		
		StackTraceElement[] stackArr = e.getStackTrace();
		for (int i = 0; i < stackArr.length; i++) {
			errorString += "\tSTACK-->: " + stackArr[i].toString();
			if((i+1) != stackArr.length) errorString += "\r\n";
		}
		return errorString;
    }
}



5.入口程序

public class MainProc {

	private static boolean IS_AUTO = false; //是否自动重启服务
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MailUtils mail = new MailUtils();
		List<String> emails = new ArrayList<String>();
		String CheckUrl = "www.*****.com";
		emails.add("*****@qq.com");
		try {
			LogUtil.writerINF("check...");
			boolean isRun = RequestUtil.isWebSiteNormal(CheckUrl);
			LogUtil.writerINF("First Check status :"+isRun);
			int checkCount = 0 ; 
			while(!isRun&&checkCount<=3){
				checkCount ++;
				LogUtil.writerINF("check "+checkCount+"time ...");
				isRun = RequestUtil.isWebSiteNormal(CheckUrl);
			}
			if(!isRun){//判断web是否可以访问
				LogUtil.writerINF("WebSite Connection Fail... Begin send Email...");
				if(IS_AUTO){
					mail.sendMutilHtmlMail("网站无法访问!", "网站无法访问,正在重新启动tomcat服务,请稍后检查网站是否可以访问", emails);
					LogUtil.writerINF("Email Send Over. Begin Restart Tomcat");
					boolean isTomcatRun = RequestUtil.isTomcatServiceAlive();
					LogUtil.writerINF("检查Tomcat是否正在运行-IsTomcatRun:"+isTomcatRun);
					if(isTomcatRun){//检查出有程序监听80端口
						TomcatUtil.stopTomcat();//停止tomcat服务
						String tcpContent = RequestUtil.getTomcatTcpIpListener();
						if(tcpContent != null && !"".equals(tcpContent)){
							Set<Integer> uidSet = RequestUtil.getUids(tcpContent);//获取tomcat的监听的uid
							if(uidSet.size() > 0 ){//是否有tomcat程序仍然在监听
								TomcatUtil.killUid(uidSet);
							}
						}
					}
					TomcatUtil.startTomcat();
					Thread.sleep(10*1000);//暂停10秒等待服务完全启动
					LogUtil.writerINF("Aleardy Restart Tomcat");
					boolean isStartSuccess = RequestUtil.isWebSiteNormal("www.qcwp.com");//判断是否启动成功
					int startCheckCount = 0 ; 
					while(!isStartSuccess&&startCheckCount<=3){
						startCheckCount ++;
						LogUtil.writerINF("Start Check "+startCheckCount+"time ...");
						isStartSuccess = RequestUtil.isWebSiteNormal("www.qcwp.com");
					}
					if(isStartSuccess){
						LogUtil.writerINF("Tomcat Start Success");
						mail.sendMutilHtmlMail("网站重启启动成功!", "网站重启成功,现在可以正常访问!", emails);
					}else{
						LogUtil.writerINF("Tomcat Start Fail");
						mail.sendMutilHtmlMail("网站重启启动失败!", "网站重启失败,请手动重启服务!", emails);
					}
				}else{
					mail.sendMutilHtmlMail("网站无法访问!", "网站无法访问,请手动重新启动tomcat服务", emails);
				}
			}

		} catch (Exception e) {
			LogUtil.writerE(e);
		}
	}

}


代码全部都贴出来了。。其中有email发送的工具类,记得加mail.jar包

另外打包的时候不能直接用MyEclipse打包。需要用Fat-jar 插件才能把导入的jar包与代码一起导出来



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值