不好意思,忘了格式,重新发public class Test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Watcher w = new Watcher(); w.setDaemon(true); w.start(); w.setStatus(false); } } class Watcher extends Thread{ //监控类 boolean status = true; Worker w = new Worker(); void setStatus(boolean status){ //设置监控器的运行状态 this.status = status; } public void run(){ w.start(); //启动被监控程序 while(status){ if(!w.isAlive()){ //测试被监控程序是否还在运行 restart(); //重新启动应用 } try { w.sleep(1000); //间隔1秒查看被监控应用的状态 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } stop(false); //监控器退出之前,关闭被监控的程序 } void stop(boolean status){ //停止被监控程序的方法 w.setStatus(false); } void restart(){ //重新启动被监控程序 w = new Worker(); w.start(); } } class Worker extends Thread{ //被监控的应用类 boolean status = true; void setStatus(boolean status){ //设置运行状态 this.status = status; } public void run(){ while(status){ //some codes } } }
唉,真晕,还是这样难看。真抱歉 最后一次贴个容易读的 public class Test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Watcher w = new Watcher(); w.setDaemon(true); //设置监控程序为后台程序 w.start(); //启动监控器 w.setStatus(false); //停止监控 } } class Watcher extends Thread{ //监控类 boolean status = true; Worker w = new Worker(); void setStatus(boolean status){ //设置监控器的运行状态 this.status = status; } public void run(){ w.start(); //启动被监控程序 while(status){ if(!w.isAlive()){ //测试被监控程序是否还在运行 restart(); //重新启动应用 } try { w.sleep(1000); //间隔1秒查看被监控应用的状态 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } stop(false); //监控器退出之前,关闭被监控的程序 } void stop(boolean status){ //停止被监控程序的方法 w.setStatus(false); } void restart(){ //重新启动被监控程序 w = new Worker(); w.start(); } } class Worker extends Thread{ //被监控的应用类 boolean status = true; void setStatus(boolean status){ //设置运行状态 this.status = status; } public void run(){ while(status){ //some codes } } }
to lovecj6185: 非常感谢你,如此热心。不过有个问题,我监控的是一另一java进程,此java进程可能宕掉不存在,可能只是不响应了。因此必须先根据某种方法判断此java进程是否存在,如果存在则得到其进程pid,并kill此进程。 那么在java中如何判断某java进程是否存在?又如何得到此进程的pid?
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Watcher w = new Watcher();
w.setDaemon(true);
w.start();
w.setStatus(false);
}}class Watcher extends Thread{ //监控类
boolean status = true;
Worker w = new Worker();
void setStatus(boolean status){ //设置监控器的运行状态
this.status = status;
}
public void run(){
w.start(); //启动被监控程序
while(status){
if(!w.isAlive()){ //测试被监控程序是否还在运行
restart(); //重新启动应用
}
try {
w.sleep(1000); //间隔1秒查看被监控应用的状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
stop(false); //监控器退出之前,关闭被监控的程序
}
void stop(boolean status){ //停止被监控程序的方法
w.setStatus(false);
}
void restart(){ //重新启动被监控程序
w = new Worker();
w.start();
}
}class Worker extends Thread{ //被监控的应用类
boolean status = true;
void setStatus(boolean status){ //设置运行状态
this.status = status;
}
public void run(){
while(status){
//some codes
}
}
}
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Watcher w = new Watcher();
w.setDaemon(true);
w.start();
w.setStatus(false);
} } class Watcher extends Thread{ //监控类 boolean status = true;
Worker w = new Worker(); void setStatus(boolean status){ //设置监控器的运行状态
this.status = status;
} public void run(){
w.start(); //启动被监控程序 while(status){
if(!w.isAlive()){ //测试被监控程序是否还在运行
restart(); //重新启动应用
}
try {
w.sleep(1000); //间隔1秒查看被监控应用的状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} stop(false); //监控器退出之前,关闭被监控的程序
} void stop(boolean status){ //停止被监控程序的方法
w.setStatus(false);
} void restart(){ //重新启动被监控程序
w = new Worker();
w.start();
}
} class Worker extends Thread{ //被监控的应用类 boolean status = true;
void setStatus(boolean status){ //设置运行状态
this.status = status;
} public void run(){
while(status){
//some codes
} }
}
最后一次贴个容易读的
public class Test1 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Watcher w = new Watcher();
w.setDaemon(true); //设置监控程序为后台程序
w.start(); //启动监控器
w.setStatus(false); //停止监控
} } class Watcher extends Thread{ //监控类 boolean status = true;
Worker w = new Worker(); void setStatus(boolean status){ //设置监控器的运行状态
this.status = status;
} public void run(){
w.start(); //启动被监控程序 while(status){
if(!w.isAlive()){ //测试被监控程序是否还在运行
restart(); //重新启动应用
}
try {
w.sleep(1000); //间隔1秒查看被监控应用的状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} stop(false); //监控器退出之前,关闭被监控的程序
} void stop(boolean status){ //停止被监控程序的方法
w.setStatus(false);
} void restart(){ //重新启动被监控程序
w = new Worker();
w.start();
}
} class Worker extends Thread{ //被监控的应用类 boolean status = true;
void setStatus(boolean status){ //设置运行状态
this.status = status;
} public void run(){
while(status){
//some codes
} }
}
非常感谢你,如此热心。不过有个问题,我监控的是一另一java进程,此java进程可能宕掉不存在,可能只是不响应了。因此必须先根据某种方法判断此java进程是否存在,如果存在则得到其进程pid,并kill此进程。
那么在java中如何判断某java进程是否存在?又如何得到此进程的pid?
你说的这个宕掉,应该理解为jvm都退出了吧
既然jvm都退出了,怎莫还能用java程序去做监视呢况且,你说的pid是linux特有的吧,并不是java特有的
所以,如果要实现你说的查找pid之类的,偶认为只有用shell去实现
至于调用这个BAT可以用windows的计划任务,也可以用楼主说的java,如果担心jvm挂了还是用计划任务吧!
BAT我贴出来~~@echo off & mode con cols=80 lines=100 &color 0a
PATH=D:\jdk1.6.0\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbemecho 正在检查服务...tasklist|find "sp_yinyuan_sp.exe"&& echo %time% 《姻缘SP端》正常...|| start D:\AllService\YinYuan\SP\sp_yinyuan_sp.exe&& echo %time% 启动《姻缘SP端》完成...tasklist|find "Yinyuan_Animal.exe"&& echo %time% 《生肖姻缘》正常...|| start D:\AllService\YinYuan\Animal\Yinyuan_Animal.exe&& echo %time% 启动《生肖姻缘》完成...tasklist|find "Yinyuan_Bloodtype.exe"&& echo %time% 《血型姻缘》正常...|| start D:\AllService\YinYuan\BloodType\Yinyuan_Bloodtype.exe&& echo %time% 启动《血型姻缘》完成...tasklist|find "Yinyuan_Constellation.exe"&& echo %time% 《星座姻缘》正常...|| start D:\AllService\YinYuan\Constellation\Yinyuan_Constellation.exe&& echo %time% 启动《星座姻缘》完成...tasklist|find "TextMMS.exe"&& echo %time% 《动漫短信》正常...|| start D:\Java\Tomcat5.5\webapps\C\TextMMS.exe&& echo %time% 启动《动漫短信》完成...tasklist|find "VerseSms_mobile.exe"&& echo %time% 《诗歌短信SP端》正常...|| start D:\AllService\VerseSMS\VerseSms_mobile.exe&& echo %time% 启动《诗歌短信SP端》完成...tasklist|find "VerseSms.exe"&& echo %time% 《诗歌短信》正常...|| start D:\AllService\VerseSMS\VerseSms.exe&& echo %time% 启动《诗歌短信》完成...tasklist|find "SPskintest.exe"&& echo %time% 《皮肤测试》正常...|| start D:\AllService\SkinTest\SPskintest.exe&& echo %time% 启动《皮肤测试》完成...tasklist|find "IWITSMS.exe"&& echo %time% 《短信故事类》正常...|| start D:\AllService\IwitSMS\IWITSMS.exe&& echo %time% 启动《短信故事类》完成...tasklist|find "AutoTimeCheck.exe"&& echo %time% 《网络对时》正常...|| start D:\AllService\AutoTimeCheck\AutoTimeCheck.exe&& echo %time% 启动《网络对时》完成...tasklist|find "PhoneBookBackup.exe"&& echo %time% 《通讯录备份》正常...|| start D:\Java\Tomcat5.5\webapps\TelBack\PhoneBookBackup.exe&& echo %time% 启动《通讯录备份》完成...tasklist|find "SMSGame.exe"&& echo %time% 《短信Game类》正常...|| start D:\AllService\SMSGame\SMSGame.exe&& echo %time% 启动《短信Game类》完成...tasklist|find "GameServer.exe"&& echo %time% 《GameServer》正常...|| start D:\AllService\GameService\GameServer.exe&& echo %time% 启动《GameServer》完成...tasklist|find "TVService.exe"&& echo %time% 《TVService》正常...|| start D:\AllService\TVService\TVService.exe&& echo %time% 启动《TVService》完成...tasklist|find "SocketServer.exe"&& echo %time% 《动态菜单》正常...|| start D:\AllService\Dynmenu\SocketServer.exe&& echo %time% 启动《动态菜单》完成...
其实楼主说的linux版应该思路是一致的
只不过把命令换成linux的就可以了
当点击startup.bat时,tomcat启动
当点击shutdown.bat时,tomcat关闭具体实现是:
startup的程序开启了一ServerSocket,并开始监听某一端口
shutdown的程序新建一Socket,发送shutdown命令,startup程序接收到时
自己安全终止。
如果shutdown不可以正常发送消息,则可以认为startup程序已经死掉
就可以后续处理了