优雅的杀死Apache Commons Exec进程

我开始在我的Java程序(在Linux上)的外部进程,我需要能够发送一个SIGTERM信号而不是发送的SIGKILL。有没有一种方法可以更好地阻止以commons-exec开始的unix进程?或者我可以获得PID,以便我可以自己运行适当的kill命令?优雅的杀死Apache Commons Exec进程

回答:

那么,Commons Exec依赖于Java Process类,它不公开PID。这也是用来杀死进程的东西,所以它不是你可以改变行为的东西。所有漂亮和封装。得爱OO,呃?

如果您只是将进程启动到后台,您可以将它们封装在一个简单的shell脚本中,为您捕获PID,然后将其保存到Java例程知道的“已知位置”。仍然有点混乱,而且,它自然不会很好地移植到其他平台上。

您可以使用JNI编写自己的exec函数来为您捕获这些信息,但这可能不那么友好。

你可以编写一个特定于平台的exec启动程序守护进程,以更加面向系统的方式(C,Python等)。您发送IT消息来启动和停止事情,并为您处理该过程。这样做的一个好处是,当你运行一个新进程时(根据你的JVM的大小,这可能会相当昂贵),你不必分叉JVM。

你可以在开始时启动守护进程并共享一个套接字或管道(两者都非常便携)。这实际上并不是一个可怕的INelegant解决方案,它划分了很多系统特定的行为(所以你可以有一个完全不同的进程,比如Windows和Unix,并且你的Java保持不变,你只需要移植你的小守护进程),而不必运行JNI。

回答:

那么你可以用grep显示它,为前:

for i in $(ps -ef | grep -i "[Y]ourClassName" | awk '{print $2}'); do kill -9 $i; done 

这是已经将它运行超过1次(尽管它,如果你只有一个项目工程)的情况下,请注意[]中grep,那么grep不会给你自己的进程pid,而-i代表忽略大小写,awk仅用于打印第二列,即PID号。

回答:

ExecuteWatchdog类有杀死进程的方法。

所以,你可以只创建一个长期超时看门狗,并用它neccessary时杀死进程,即

executor.getWatchdog().destroyProcess(); 

以上是 优雅的杀死Apache Commons Exec进程 的全部内容, 来源链接: utcz.com/qa/258490.html

回到顶部