如何将Java SIGINT信号发送到外部进程?

问题描述:

我有一个Java应用程序,它创建一个外部进程并通过InputStream读取进程的stdout。当我完成它时,我需要能够杀死进程。有没有办法将SIGINT信号发送到这个过程? (就像我从控制台按下Ctrl + C一样)。如何将Java SIGINT信号发送到外部进程?

外部过程不是我的代码,我不能修改它。

你是否正在运行外部程序为java.lang.Process?由于Process类有一个destroy()方法。

+8

这似乎发出一个SIGTERM信号,不是SIGINT。在这里看到这个问题:http://*.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –

你能送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

+2

没有平台无关的解决方案,因为[Windows没有信号](http://*.com/questions/140111/sending-an-arbitrary-signal-in-windows)。 –

+0

@fix_moeller:我猜你是对的。但也许有一个图书馆提供某种抽象,至少是为了杀死其他进程... –

+0

@Lukas埃德尔,我有一个问题,如果我打开这个过程中的一个新的线程,然后让我们说它被绞死等,并且我杀死它在Linux中使用SIGINT(从另一个线程),它基本上杀死了我的整个Java程序,有没有可能只有这个特定的进程被杀害,而我的程序仍在运行? –

不幸的是,没有在Java发送arbirtray信号的本机方式。

我同意Lukas使用Runtime.exec()或者你可以使用类似Posix for Java库的东西。

如果您想将信号发送到当前进程(又名JVM),可以使用sun.misc.Signal.raise()方法为其他人从Google到达此处。我个人需要它,因为我正在使用一个JNI库。

+0

这似乎并没有发送一个实际的信号,只是调用信号处理程序。或者? – dkagedal

+0

@Jason Axelson我也使用sun.misc.Signal.raise(新信号(“TERM”));我正在初始化一个JNI组件它保持运行并永不停止,即将到来我的其他线程停止。所以我正在使用此解决方案来关闭我的应用程序。 – vijayashankard