Java Watchdog监控[关闭]

问题描述 投票:3回答:1

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

1)被动监控。

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

2)主动监控。

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

看门狗将启动所有进程。

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

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

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

谢谢

java linux windows monitoring
1个回答
0
投票
  1. 您可以通过写入/读取进程int / outputstream来“发出信号”进程
  2. 好吧,实现te线程(见下文)
  3. 我不知道...

也许这个片段有帮助

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();
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.