在linux平台上想运行一java监控程序时刻监控一应用,如不响应就重启动此应用程序?此java程序如何写,如何运行?如何关闭应用并重新启动?

解决方案 »

  1.   

    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
    }

    }
    }
      

  2.   

    不好意思,忘了格式,重新发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 
    } } 
    }
      

  3.   

    唉,真晕,还是这样难看。真抱歉
    最后一次贴个容易读的
    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 
    }  } 
    }
      

  4.   

    to lovecj6185:
       非常感谢你,如此热心。不过有个问题,我监控的是一另一java进程,此java进程可能宕掉不存在,可能只是不响应了。因此必须先根据某种方法判断此java进程是否存在,如果存在则得到其进程pid,并kill此进程。
       那么在java中如何判断某java进程是否存在?又如何得到此进程的pid?
      

  5.   

    那么在java中如何判断某java进程是否存在?又如何得到此进程的pid?java进程可能宕掉
    你说的这个宕掉,应该理解为jvm都退出了吧
    既然jvm都退出了,怎莫还能用java程序去做监视呢况且,你说的pid是linux特有的吧,并不是java特有的
    所以,如果要实现你说的查找pid之类的,偶认为只有用shell去实现
      

  6.   

    这个我有做过,我用的BAT文件,检查任务管理器里的程序是否存在,不存在则启动! 
    至于调用这个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% 启动《动态菜单》完成...
      

  7.   

    恩,楼上的这是windows版的吧
    其实楼主说的linux版应该思路是一致的
    只不过把命令换成linux的就可以了
      

  8.   

    可以参照tomcat等应用程序的的做法
    当点击startup.bat时,tomcat启动
    当点击shutdown.bat时,tomcat关闭具体实现是:
    startup的程序开启了一ServerSocket,并开始监听某一端口
    shutdown的程序新建一Socket,发送shutdown命令,startup程序接收到时
    自己安全终止。
    如果shutdown不可以正常发送消息,则可以认为startup程序已经死掉
    就可以后续处理了