我已经被一个不会合作并干净退出的java进程所困扰(它会被埋在一些我无法控制的低级库中)。我现在正在测试一种看门狗,它在某个预先确定的时间对进程实施硬停止,ScheduledStop
. 该看门狗是一个单独的类,它运行一个独立的线程,如果预定的停止时间到达,它将终止整个进程。通常,所有线程都应该在该硬停止时间之前很好地返回,并且程序会优雅地退出。但是,如果有必要,进程会自行终止,文件锁会被释放等。所有这些都在 Linux 上运行。
我似乎记得,即使System.exit(0)
不是万无一失的(我认为如果某些关闭挂钩卡住,该过程可能会保持活动状态),所以我编造了一些类似的东西:
int pid = MyUtil.getPID();
Runtime.getRuntime().exec(new String[]{"kill", "-9", String.valueOf(pid)});
现在,我想用一些非常不合作的线程来测试它,可能还有一些关闭钩子,这些钩子是为了测试而设计的,效果不佳。
下面的最初的 NastyThread 并不是那么讨厌......它忽略了InterruptionException
,但不阻止System.exit(0)
。我怎样才能让我的虚拟机进入一个甚至exit()
不会终止的状态?
另一个问题是,虽然看门狗线程在理论上是独立的,但其他线程完全抢占它,从而挫败预定停止的条件是什么?
如有必要,我可以启动一个单独的进程(例如一个简单的 perl 脚本),在某个指定时间杀死父进程(java 进程)。
/**
* A Runnable that runs forever and ignores InterruptedException.
*/
private static class NastyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("Received and ignoring "+e);
System.out.flush();
}
System.out.println(ScheduledStop.getInstance().toString());
}
}
}