2011-10-20 66 views
17

我有一個Java應用程序,它創建一個外部進程並通過InputStream讀取進程的stdout。當我完成它時,我需要能夠殺死進程。有沒有辦法將SIGINT信號發送到這個過程? (就像我從控制檯按下Ctrl + C一樣)。如何將Java SIGINT信號發送到外部進程?

外部過程不是我的代碼,我不能修改它。

回答

2

你是否正在運行外部程序爲java.lang.Process?由於Process類有一個destroy()方法。

+8

這似乎發出一個SIGTERM信號,不是SIGINT。在這裏看到這個問題:http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –

13

你能送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://stackoverflow.com/questions/140111/sending-an-arbitrary-signal-in-windows)。 –

+0

@fix_moeller:我猜你是對的。但也許有一個圖書館提供某種抽象,至少是爲了殺死其他進程... –

+0

@Lukas埃德爾,我有一個問題,如果我打開這個過程中的一個新的線程,然後讓我們說它被絞死等,並且我殺死它在Linux中使用SIGINT(從另一個線程),它基本上殺死了我的整個Java程序,有沒有可能只有這個特定的進程被殺害,而我的程序仍在運行? –

2

不幸的是,沒有在Java發送arbirtray信號的本機方式。

我同意Lukas使用Runtime.exec()或者你可以使用類似Posix for Java庫的東西。

3

如果您想將信號發送到當前進程(又名JVM),可以使用sun.misc.Signal.raise()方法爲其他人從Google到達此處。我個人需要它,因爲我正在使用一個JNI庫。

+0

這似乎並沒有發送一個實際的信號,只是調用信號處理程序。或者? – dkagedal

+0

@Jason Axelson我也使用sun.misc.Signal.raise(新信號(「TERM」));我正在初始化一個JNI組件它保持運行並永不停止,即將到來我的其他線程停止。所以我正在使用此解決方案來關閉我的應用程序。 – vijayashankard