我不知道为什么在linux上有时候./shutdown.sh不能关闭掉tomcat,我估计是因为有其它的进程在使用它,于是每次都只能手动的kill -9去杀掉他,后来我嫌麻烦于是自己写了个监控PID的脚本,然后用JAVA程序去访问我的页面,如果异常或者超时,我就调用这个监控去杀掉tomcat,并重新启动它
首先我要准备一个脚本叫做killtomcat.sh,哈哈,监控的原理很简单通过ps -ef|grep 来实现
首先我要准备一个脚本叫做killtomcat.sh,哈哈,监控的原理很简单通过ps -ef|grep 来实现
1
#!/bin/bash
2
export JAVA_HOME=/local/akazam/servers/java
3
export CATALINA_HOME=/local/akazam/servers/tomcat
4
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/td.jar:$JAVA_HOME/jre/lib/rt.jar:$CATALINA_HOME/lib/servlet-api:$CATALINA_HOME/lib/catalina-ant.jar:$CATALINA_HOME/lib/catalina.jar:$CATALINA_HOME/lib/annotations-api.jar:$CATALINA_HOME/lib/tomcat-coyote.jar:$CATALINA_HOME/lib/tomcat-dbcp.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/commons-pool.jar:$CATALINA_HOME/lib/common-dbcp.jar:$CATALINA_HOME/lib/catalina-tribes:$CATALINA_HOME/lib/catalina-ha.jar:.
5
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$CATALINA_HOME/bin:$PATH
6
TOMCAT_PATH=/local/akazam/servers/tomcat/bin
7
if [ $# -eq 0 ]
8
then
9
echo "ERROR:Usage: process argument
" 1>&2
10
echo "eg:If you want to restart tomcat you can enter ./restart.sh tomcat!" 1>&2
11
exit 1
12
fi
13
path=$1
14
set $(ps -ef|grep $path)
15
pid=$2
16
flaggrep=$8
17
echo "tomcat pid : $pid,flag : $flaggrep"
18
19
if [ "$flaggrep" = "grep" -o "$flaggrep" = "/bin/bash" ]
20
then
21
echo "no thread start"
22
else
23
#kill tomcat
24
kill -9 $pid
25
sleep 3
26
echo "killed thread"
27
fi
28
#start tomcat
29
cd $TOMCAT_PATH
30
./startup.sh
31
echo "tomcat restart!"
接下来就要写个JAVA类来监控了
#!/bin/bash2
export JAVA_HOME=/local/akazam/servers/java3
export CATALINA_HOME=/local/akazam/servers/tomcat4
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/td.jar:$JAVA_HOME/jre/lib/rt.jar:$CATALINA_HOME/lib/servlet-api:$CATALINA_HOME/lib/catalina-ant.jar:$CATALINA_HOME/lib/catalina.jar:$CATALINA_HOME/lib/annotations-api.jar:$CATALINA_HOME/lib/tomcat-coyote.jar:$CATALINA_HOME/lib/tomcat-dbcp.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/commons-pool.jar:$CATALINA_HOME/lib/common-dbcp.jar:$CATALINA_HOME/lib/catalina-tribes:$CATALINA_HOME/lib/catalina-ha.jar:.5
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$CATALINA_HOME/bin:$PATH6
TOMCAT_PATH=/local/akazam/servers/tomcat/bin7
if [ $# -eq 0 ]8
then9
echo "ERROR:Usage: process argument
" 1>&210
echo "eg:If you want to restart tomcat you can enter ./restart.sh tomcat!" 1>&211
exit 112
fi13
path=$114
set $(ps -ef|grep $path)15
pid=$216
flaggrep=$817
echo "tomcat pid : $pid,flag : $flaggrep"18

19
if [ "$flaggrep" = "grep" -o "$flaggrep" = "/bin/bash" ]20
then21
echo "no thread start"22
else23
#kill tomcat24
kill -9 $pid25
sleep 326
echo "killed thread"27
fi28
#start tomcat29
cd $TOMCAT_PATH30
./startup.sh31
echo "tomcat restart!"
1
package com.akazam.monitor;
2
3
import java.io.BufferedReader;
4
import java.io.File;
5
import java.io.IOException;
6
import java.io.InputStreamReader;
7
import java.net.HttpURLConnection;
8
import java.net.URL;
9
import java.util.Date;
10
11
public class MonitorTomcat
{
12
public long getLoadMS(String url)
{
13
long time1=System.currentTimeMillis();
14
15
int i=0;
16
// 带参数目录名方式运行 dir 命令
17
Runtime runtime = Runtime.getRuntime();
18
String classDir = this.getClass().getResource("/").getPath();
19
String command= classDir+"killtomcat.sh tomcat/";
20
try
{
21
URL target = new URL(url);
22
HttpURLConnection conn = (HttpURLConnection) target.openConnection();
23
conn.setRequestMethod("GET");
24
conn.connect();
25
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
26
while (in.readLine() != null)
{
27
i++;
28
}
29
}catch(Exception e)
{
30
//重启tomcat
31
try
{
32
Process process = runtime.exec(new String[]
{"/bin/bash","killtomcat.sh","tomcat/"},null,new File(classDir));
33
System.out.println(e.getMessage()+"\r\nRun command is:"+command);
34
if(process!=null)
35
{
36
BufferedReader in = new BufferedReader(new InputStreamReader(
37
process.getInputStream()));
38
String line;
39
while ((line = in.readLine()) != null)
{
40
System.out.println(line+"\r\n");
41
}
42
try
{
43
44
if (process.waitFor() != 0)
{
45
46
System.err.println("exit value = " + process.exitValue());
47
48
}
49
50
}
51
52
catch (InterruptedException ec)
{
53
54
System.err.println(ec);
55
56
}
57
58
59
60
}
61
else return -1;
62
} catch (IOException e1)
{
63
// TODO Auto-generated catch block
64
//e1.printStackTrace();
65
System.out.println(e1.getMessage()+"\r\n");
66
}
67
68
}
69
long time2 = new Date().getTime();
70
long result = time2-time1;
71
if(result>60000)
72
{
73
//重启tomcat
74
try
{
75
76
Process process = runtime.exec(new String[]
{"/bin/bash","killtomcat.sh","tomcat/"},null,new File(classDir));
77
if(process!=null)
78
{
79
BufferedReader in = new BufferedReader(new InputStreamReader(
80
process.getInputStream()));
81
String line;
82
try
{
83
while ((line = in.readLine()) != null)
{
84
System.out.println(line+"\r\n");
85
}
86
try
{
87
88
if (process.waitFor() != 0)
{
89
90
System.err.println("exit value = " + process.exitValue());
91
92
}
93
94
}
95
96
catch (InterruptedException ec)
{
97
98
System.err.println(ec);
99
System.out.println(ec.getMessage()+"\r\n");
100
package com.akazam.monitor;2

3
import java.io.BufferedReader;4
import java.io.File;5
import java.io.IOException;6
import java.io.InputStreamReader;7
import java.net.HttpURLConnection;8
import java.net.URL;9
import java.util.Date;10

11

{12

public long getLoadMS(String url)
{13
long time1=System.currentTimeMillis();14
15
int i=0;16
// 带参数目录名方式运行 dir 命令17
Runtime runtime = Runtime.getRuntime();18
String classDir = this.getClass().getResource("/").getPath();19
String command= classDir+"killtomcat.sh tomcat/";20

try
{ 21
URL target = new URL(url); 22
HttpURLConnection conn = (HttpURLConnection) target.openConnection(); 23
conn.setRequestMethod("GET"); 24
conn.connect(); 25
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 26

while (in.readLine() != null)
{27
i++;28
} 29

}catch(Exception e)
{ 30
//重启tomcat31

try
{32

Process process = runtime.exec(new String[]
{"/bin/bash","killtomcat.sh","tomcat/"},null,new File(classDir));33
System.out.println(e.getMessage()+"\r\nRun command is:"+command);34
if(process!=null)35

{36
BufferedReader in = new BufferedReader(new InputStreamReader(37
process.getInputStream()));38
String line;39

while ((line = in.readLine()) != null)
{40
System.out.println(line+"\r\n");41
}42

try
{43

44

if (process.waitFor() != 0)
{45

46
System.err.println("exit value = " + process.exitValue());47

48
} 49

50
}51

52

catch (InterruptedException ec)
{ 53

54
System.err.println(ec);55

56
}57

58

59
60
}61
else return -1;62

} catch (IOException e1)
{63
// TODO Auto-generated catch block64
//e1.printStackTrace();65
System.out.println(e1.getMessage()+"\r\n");66
}67
68
} 69
long time2 = new Date().getTime(); 70
long result = time2-time1;71
if(result>60000)72

{73
//重启tomcat74

try
{75
76

Process process = runtime.exec(new String[]
{"/bin/bash","killtomcat.sh","tomcat/"},null,new File(classDir));77
if(process!=null)78

{79
BufferedReader in = new BufferedReader(new InputStreamReader(80
process.getInputStream()));81
String line;82

try
{83

while ((line = in.readLine()) != null)
{84
System.out.println(line+"\r\n");85
}86

try
{87

88

if (process.waitFor() != 0)
{89

90
System.err.println("exit value = " + process.exitValue());91

92
} 93

94
}95

96

catch (InterruptedException ec)
{ 97

98
System.err.println(ec);99
System.out.println(ec.getMessage()+"\r\n");100
本文介绍了一种在Linux环境下自动监控并重启Tomcat的方法。通过编写shell脚本来查找并终止Tomcat进程,同时利用Java程序监测Tomcat状态,一旦发现异常或超时即触发重启流程。
1899

被折叠的 条评论
为什么被折叠?



