如何将Java SIGINT信号发送到外部进程?
我有一个Java应用程序,它创建一个外部进程并通过InputStream读取进程的stdout。当我完成它时,我需要能够杀死进程。有没有办法将SIGINT信号发送到这个过程? (就像我从控制台按下Ctrl + C一样)。如何将Java SIGINT信号发送到外部进程?
外部过程不是我的代码,我不能修改它。
你是否正在运行外部程序为java.lang.Process
?由于Process类有一个destroy()
方法。
你能送kill -SIGINT <pid>
的过程(因为你知道进程的ID):
Runtime.getRuntime().exec("kill -SIGINT 12345");
当然,这将使一个依赖于平台的解决方案...潜在的,你就可以使用此工具,尽管它处于“沙箱模式”。但它可能给你一个想法:
http://commons.apache.org/sandbox/runtime/
也在这里见此相关的问题:
how can I kill a Linux process in java with SIGKILL Process.destroy() does SIGTERM
没有平台无关的解决方案,因为[Windows没有信号](http://*.com/questions/140111/sending-an-arbitrary-signal-in-windows)。 –
@fix_moeller:我猜你是对的。但也许有一个图书馆提供某种抽象,至少是为了杀死其他进程... –
@Lukas埃德尔,我有一个问题,如果我打开这个过程中的一个新的线程,然后让我们说它被绞死等,并且我杀死它在Linux中使用SIGINT(从另一个线程),它基本上杀死了我的整个Java程序,有没有可能只有这个特定的进程被杀害,而我的程序仍在运行? –
如果您想将信号发送到当前进程(又名JVM),可以使用sun.misc.Signal.raise()方法为其他人从Google到达此处。我个人需要它,因为我正在使用一个JNI库。
这似乎并没有发送一个实际的信号,只是调用信号处理程序。或者? – dkagedal
@Jason Axelson我也使用sun.misc.Signal.raise(新信号(“TERM”));我正在初始化一个JNI组件它保持运行并永不停止,即将到来我的其他线程停止。所以我正在使用此解决方案来关闭我的应用程序。 – vijayashankard
这似乎发出一个SIGTERM信号,不是SIGINT。在这里看到这个问题:http://*.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –