免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3467 | 回复: 0

java写的一个监控tomcat容器程序 [复制链接]

论坛徽章:
0
发表于 2009-01-09 18:08 |显示全部楼层
由于tomcat部署的应用,在客户使用的过程中,每过五六天总会吊死成僵尸进程,查看日志为无效的变元,搜遍网络,尝试了很多办法也没有解决此问题。同时不能更换web容器,因为会增加成本,只好用java写了个监控程序,目前正在测试中

package dzews;
/**
* NAME : tomcat.java
* FUNCTION : 监控服务器tomcat状态
* PROGRAMMED : TELSTAR/jlsu
* DATE(ORG) : 20090109
* PROJECT : TELSTAR
* OS : HP-UNIX
* HISTORY :
*/
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import java.util.TimeZone;
        
public class tomcat {
    private long sJKdate;   
    public tomcat() {
        Date now = new Date();
        sJKdate = now.getTime();
        
    }
    private static final Logger logger = Logger.getLogger(tomcat.class);
  private static void keepTomcatAlive() throws NullPointerException {
    String s;
    boolean isTomcatAlive = false;
    java.io.BufferedReader in;
     Date now = new Date();
        long lnow = now.getTime();
        Date selDate = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
        String sSel_date = df.format(selDate);
    try {
      URL url = new URL("http://133.128.4.7:8080/index.jsp");
      URLConnection con = url.openConnection();
      in = new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
      con.setConnectTimeout(1000);
      con.setReadTimeout(4000);
      while ((s = in.readLine()) != null) {
        if (s.length() > 0) {
          // 如果in.readLine的内容不为空,则证明当前的tomcat容器可用,不过操作直接返回
          return;
        }
      }
      in.close();
    } catch (Exception ex) {
    }
    try {
      java.lang.Process p = java.lang.Runtime.getRuntime().exec("ps -ef | grep Djava.uti | grep -v tail | grep -v vi | grep -v grep | awk '{print $2}'");
      in = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
      while ((s = in.readLine()) != null) {
          isTomcatAlive = true;
          break;
      }
      in.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (isTomcatAlive) {
      logger.debug(" + sSel_date + "> Tomcat is alive but not response!");
      stopTomcat();
    }
    startTomcat();
  }
  public static void stopTomcat() {
         Date now = new Date();
        long lnow = now.getTime();
        Date selDate = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
        String sSel_date = df.format(selDate);
    try {
         logger.debug("------------------开始杀死僵尸tomcat---------------------");
     
    java.lang.Process p = java.lang.Runtime.getRuntime().exec("kill -9 `ps -ef | grep Djava.uti | grep -v tail | grep -v vi | grep -v grep | awk '{print $2}'`");
    java.lang.Process p1 = java.lang.Runtime.getRuntime().exec("ps -ef |grep java | grep -v vi | grep -v tail | grep -v grep");
      java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(p1.getInputStream()));
      String s;
      String t = "Djava";
      boolean restart = false;
      while ((s = in.readLine()) != null) {
        if (s.indexOf(t) == -1) {
          restart = true;
          break;
        }
      }
      logger.debug(" + sSel_date + "> Tomcat is stop " + (restart ? "OK" : "ERROR"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static void startTomcat() {
     Date now = new Date();
        long lnow = now.getTime();
        Date selDate = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
        String sSel_date = df.format(selDate);
    try {
        java.lang.Process p = java.lang.Runtime.getRuntime().exec("kill -9 `ps -ef | grep Djava.uti | grep -v tail | grep -v vi | grep -v grep | awk '{print $2}'`");
         
    } catch (Exception e) {
      e.printStackTrace();
    }
    try {
         logger.debug("------------------开始重启---------------------");
        java.lang.Process p1 = java.lang.Runtime.getRuntime().exec("/telstar/tomcat/bin/./startup.sh &");
      java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(p1.getInputStream()));
      String s;
      String t = "tomcat";
      boolean restart = false;
      while ((s = in.readLine()) != null) {
        if (s.indexOf(t) != -1) {
          restart = true;
          break;
        }
      }
      logger.debug(" + sSel_date + "> Tomcat is start " + (restart ? "OK" : "ERROR"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
        Date now = new Date();
        long lnow = now.getTime();
        Date selDate = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
        String sSel_date = df.format(selDate);
     PropertyConfigurator.configure("/telstar/bin/tomcatJK/logtomcatJK.properties");
     logger.debug("------------------开始监控---------------------");
    while (true) {
      try {
        tomcat.keepTomcatAlive();
        logger.debug("------------------检测tomcat状态---------------------");
        Thread.sleep(24000);
      } catch (Exception ex) {
      }
    }
  }
}


log4j属性文件配置如下log4j.properties


log4j.rootLogger=DEBUG,R

#Log4j提供的appender有以下几种:
#org.apache.log4j.ConsoleAppender(控制台),
#org.apache.log4j.FileAppender(文件),
#org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
#org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
#org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#其中log4j提供4种布局.
#org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout


# Pattern to output the caller


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/54454/showart_1785380.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP