我正在尝试在java(windows和linux)中开发一个看门狗,他们将以两种方式运行:
1)被动监控。
过程完成后,监督人员需要检查过程完成的返回值。 (出口(1),出口(0)…)
2)主动监控。
该过程需要每隔一个时间间隔“触摸”属于他的文件(x)。 看门狗将检查每个间隔(y),如果该过程通过检查文件戳“触摸”他的文件。 如果进程没有触及该文件,则看门狗将尝试向触发文件的进程发送信号。 主动监视目的是杀死死锁进程。
看门狗将启动所有的进程。
1)如何发送过程信号的jvm? 一个信号是触摸文件的过程的“提醒”。 另一个信号是杀死进程。
2)如何在线程上实现这个想法?
3)我可以使用Java中的任何API吗?
谢谢
也许这个片段有帮助
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(); } } }