我有一個Java應用程序,它創建一個外部進程並通過InputStream讀取進程的stdout。當我完成它時,我需要能夠殺死進程。有沒有辦法將SIGINT信號發送到這個過程? (就像我從控制檯按下Ctrl + C一樣)。如何將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://stackoverflow.com/questions/140111/sending-an-arbitrary-signal-in-windows)。 –
@fix_moeller:我猜你是對的。但也許有一個圖書館提供某種抽象,至少是爲了殺死其他進程... –
@Lukas埃德爾,我有一個問題,如果我打開這個過程中的一個新的線程,然後讓我們說它被絞死等,並且我殺死它在Linux中使用SIGINT(從另一個線程),它基本上殺死了我的整個Java程序,有沒有可能只有這個特定的進程被殺害,而我的程序仍在運行? –
不幸的是,沒有在Java發送arbirtray信號的本機方式。
我同意Lukas使用Runtime.exec()或者你可以使用類似Posix for Java庫的東西。
如果您想將信號發送到當前進程(又名JVM),可以使用sun.misc.Signal.raise()方法爲其他人從Google到達此處。我個人需要它,因爲我正在使用一個JNI庫。
這似乎並沒有發送一個實際的信號,只是調用信號處理程序。或者? – dkagedal
@Jason Axelson我也使用sun.misc.Signal.raise(新信號(「TERM」));我正在初始化一個JNI組件它保持運行並永不停止,即將到來我的其他線程停止。所以我正在使用此解決方案來關閉我的應用程序。 – vijayashankard
這似乎發出一個SIGTERM信號,不是SIGINT。在這裏看到這個問題:http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –