Java Watchdog监控

时间:2013-12-17 12:28:24

标签: java linux windows monitoring

我正在尝试在java(windows和linux)中开发一个看门狗,它将以两种方式运行:

1)被动监控。

在该过程完成其工作后,看门狗需要检查过程完成的返回值。 (退出(1),退出(0)......)

2)主动监控。

该过程需要在每个间隔(x)“触摸”属于他的文件。 如果进程通过检查文件标记“触摸”他的文件,监视器将检查每个间隔(y)。 如果进程未触及该文件,则看门狗将尝试向进程发送信号以触摸该文件。 主动监视目的是杀死具有死锁的进程。

看门狗将启动所有流程。

1)如何发送过程信号的jvm?一个信号是触摸文件的过程的“提醒”。 另一个信号是杀死这个过程。

2)我如何在线程上实现这个想法?

3)我可以使用Java中的任何API吗?

由于

1 个答案:

答案 0 :(得分:0)

  1. 您可以通过写入/读取流程int / outputstream
  2. 来“发出信号”
  3. 好吧,实现te线程(见下文)
  4. 我不知道......
  5. 也许这个片段有帮助

    public class ProcessTest {
    
        public static void main(String[] args) {
            new ProcessTest().start();
        }
    
        private void start() {
            startWatchDog();
            startProcess();
        }
    
        private boolean abortCondition = false;
        private int watchDogTSleepTime = 3000; //3 sek
        private void startWatchDog() {
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    while(!abortCondition){
                        try {
                            Thread.sleep(watchDogTSleepTime);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                        //check the file touch
                        boolean ok = checkFileTouch();
    
                        try {
                            //send signals to the process
                            outStream.write("signal".getBytes() );
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    
                        //if you want, you might try to kill the process
                        process.destroy();
                    }
                }
            };
    
            Thread watchDog = new Thread(r);
            watchDog.start();
            //watchDog.setDaemon(true); //maybe
        }
    
        private boolean checkFileTouch(){
            //...
            return false;
        }
    
        private InputStream inStream;
        private OutputStream outStream;
        private Process process;
        private void startProcess() {       
            String[] cmd = new String[]{"foo.exe", "para1", "param2"};
            try {
                //create and start the process
                process = Runtime.getRuntime().exec(cmd);
                inStream = process.getInputStream();
                outStream = process.getOutputStream();          
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }