是否有可能捕獲Ctrl + C信號在Java命令行應用程序中?我想在終止程序之前清理一些資源。在Java中捕獲Ctrl + C
58
A
回答
65
您可以將shutdown hook每當虛擬機關閉它獲取運行VM:
Java虛擬機在響應關閉以兩種事件:
程序當最後一個非守護進程線程退出或退出(等效地,System.exit)方法被調用時退出,或者
該virt響應於用戶中斷終止計算機,諸如鍵入Ctrl + C或系統範圍的事件,諸如用戶註銷或系統關閉。
你傳遞的關閉鉤子必須遵循一些規則,但是,一定要仔細閱讀所鏈接的文檔,以避免出現任何問題的線索。這包括確保線程安全,線程快速終止等。
另外,正如Jesper指出的那樣,關閉掛鉤保證在VM正常關閉時運行,但如果VM進程被強制終止,噸。如果原生代碼出現故障,或者您強行終止進程(kill -9
,taskkill /f
),則可能會發生這種情況。
但是在這些情況下,所有的賭注都無濟於事,所以我不會浪費太多的思考。
14
只是爲了快速控制檯測試目的...
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
Thread.sleep(200);
System.out.println("Shouting down ...");
//some cleaning up code...
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
+2
你的例子是RaspberryPI特定的('SoftPwm','gpio')。您可能想要跳過這些方法調用。 – harpun 2015-10-04 13:41:24
相關問題
- 1. Vb.net捕獲Ctrl + C
- 2. 如何捕獲WPF/C#中的CTRL-BACKSPACE?
- 3. C#捕獲按Ctrl + PageUp鍵按鍵
- 4. 在bash腳本中的ssh中捕獲Ctrl-C
- 5. 無法捕獲按Ctrl + C在C#控制檯應用程序
- 6. 在Java中捕獲異常
- 7. 在Java中捕獲TransactionRolledbackLocalException
- 8. 在JAVA中捕獲PSQLException
- 9. WPF - 按下CTRL + SHIFT時如何捕獲?
- 10. 如何在C++中使用preTranslate消息捕獲組合鍵ALT + CTRL + INSERT
- 11. 捕獲CTRL-C並使用wxpython處理剪貼板數據
- 12. 無法捕獲ctrl-c退出函數退出bash腳本
- 13. 使用Ctrl-C退出tkinter應用並捕獲SIGINT
- 14. c#如何從文本框捕獲Ctrl-R
- 15. 如何在Qt中捕捉Ctrl + Plus?
- 16. 如何在.NET中實時捕獲numericUpDown ctrl的值更改?
- 17. Python:如何在QT GUI中捕獲Ctrl-O鍵按下?
- 18. CTRL-C不能在Java程序工作
- 19. 如何在Ctrl'C'之前釋放Ctrl時用Qt捕捉Ctrl + C鍵事件?
- 20. 捕獲的Java
- 21. 在C#中捕獲SOAP,在DLL中
- 22. 如何在獲取Ctrl + C後退出?
- 23. 比較拉姆達捕獲C#和Java
- 24. 如何捕獲CTRL + C並執行python中的主函數內的條件?
- 25. 捕獲CTRL + V或粘貼到.NET中的文本框中
- 26. 正則表達式捕獲在Java中像C#
- 27. 捕獲用C
- 28. Android:在javascript中捕獲java例外
- 29. 在java中捕獲xsl:消息輸出
- 30. 在java面板中捕獲按鍵
當心關閉掛鉤,不能保證在任何情況下運行;可能會出現這種情況,因爲它們沒有運行,所以請勿根據您在關機掛鉤中執行的操作來使程序正常運行。 – Jesper 2009-10-23 08:08:20
當進程被強制終止時('TerminateProcess()'或'SIGKILL'),它們不會運行,但超出了正常運行的範圍,並且由於Ctrl + C已經被關閉鉤子覆蓋了,所以使用它是安全的。無論如何,如果操作系統真的終止你的進程,你不能做太多事情。 – Joey 2009-10-23 08:45:38
如果我執行'kill'(發送一個TERM信號),這會在關機掛鉤中被捕獲嗎? (請注意,它不同於'kill -9',我從上面可以理解它不會陷入困境。) – ADTC 2013-11-07 11:20:20