我正在尝试用 java(windows 和 linux)开发一个看门狗,它将以两种方式运行:
1) 被动监测。
进程完成工作后,看门狗需要检查进程完成的返回值。 (退出(1),退出(0)...)
2) 主动监控。
进程每隔interval(x)就需要“touch”一个属于自己的文件。
如果进程通过检查文件戳“触摸”他的文件,看门狗将检查每个时间间隔 (y)。
如果进程没有接触文件,看门狗将尝试向接触文件的进程发送信号。
主动监控的目的是杀死有死锁的进程。
看门狗将启动所有进程。
1) 如何发送进程信号的 jvm?一个信号是进程触摸文件的“提醒”。
另一个信号是终止进程。
2) 如何在线程上实现这个想法?
3) 我可以使用 Java 中的任何 API?
谢谢
- 您可以通过写入/读取进程 int/outputstream 来“通知”进程
- 好吧,实现线程(见下文)
- 我不知道...
也许这段代码有帮助
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();
}
}
}