我開始在我的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();
對,但發送SIGKILL。問題是如何發送不同的信號,如SIGTERM,以更優雅地停止它。 – jtb
@audras實際上,你最好使用'新的ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT)',而不僅僅是* long * timeout。 –
- 1. Apache Commons Exec的進程對象
- 2. 如果exec失敗,殺死子進程
- 3. 殺死進程殺死其他進程
- 4. apache是否會殺死我的進程?
- 5. 殺死進程
- 6. 殺死進程
- 7. 殺死進程
- 8. `exec`殺死腳本
- 9. 在mod_python中殺死單個Apache進程
- 10. Bash子進程在執行eval時殺死父進程exec
- 11. 殺死不會殺死進程
- 12. SIGKILL殺死進程
- 13. Android殺死進程
- 14. VB.NET - 殺死進程
- 15. 殺死進程SHELL
- 16. 殺死進程winword
- 17. 殺死mysqld進程
- 18. 我該如何殺死Windows上由exec運行的子進程?
- 19. Vbscript中的殺死進程
- 20. bluestacks的殺死進程/結束進程
- 21. 殺死產生進程的進程
- 22. 查殺Linux程序的優雅方式
- 23. Perl fork(),exec()然後殺死創建殭屍進程
- 24. commons-exec線程安全嗎?
- 25. 優雅地殺死一個耗時太長的方法
- 26. 優雅地殺死一個孤立的套接字
- 27. uWSGI和優雅地殺死一個多線程的Flask應用程序
- 28. 殺死進程列表
- 29. 無法殺死Postgres進程
- 30. 用vbscript殺死Java進程
是的,這是一個從shell腳本執行java jar的好主意,所以你知道要殺死哪一個java jar。 +1 – ant
好的,謝謝你的信息。真的很奇怪,他們沒有公開這種功能,我只需要在python中解決它。遊民。 – jtb