簡體   English   中英

Java的.addShutdownHook為什么不能在BeagleBone Black上的Ctrl-C起作用? 有解決方法嗎?

[英]Why doesn't Java's .addShutdownHook work for Ctrl-C on BeagleBone Black? Is there a workaround?

問題

我已經在我的Ubuntu開發機器和BeagleBone Black上運行了以下Clojure代碼,並可以確認它在前者上有效,但在后者上卻無效。

(defn setup-shutdown-hook!                           
  [f]                                                  
  (.addShutdownHook (Runtime/getRuntime) (Thread. f))) 

(setup-shutdown-hook!
  (fn []
    (println "I am no more")))

(defn -main []
  (doseq [i (range)]
    (Thread/sleep 1000)
    (println "Staying alive")))

在BBB上,關閉鈎子在“自然”關閉的情況下確實可以正常工作,但在Ctrl-C上則不能。 在Ubuntu機器上,它似乎總是可以工作。

對於這種不同的行為有一些解釋嗎? Java版本? 系統級差異? 是否有解決方法以獲得所需的行為?

系統詳情

Ubuntu:

java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

Beaglebone(運行Angstrom;通過SSH連接):

> java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode)
> uname -a
Linux beaglebone 3.8.13 #1 SMP Wed Sep 4 09:09:32 CEST 2013 armv7l GNU/Linux

PS對於那些熟悉Java但不熟悉Clojure的人,上面的Clojure代碼只是通過它的互操作連接到Java方法。 希望你可以測試一下

哦,親愛的...這里沒有什么神秘之處。 我很懶惰,有點作弊,然后用lein exec而不是lein run在Ubuntu計算機上lein run (就像我在BBB上一樣)。 顯然,這種方式的行為似乎有所不同...

關於如何獲得所需行為, lein trampoline run -m <ns>可以解決問題。 問題似乎在於,由於使用lein run有效地在嵌套JVM中運行您的應用程序,因此leiningen進程捕獲了Ctrl-C而不是您的應用程序代碼。 使用lein trampoline應用程序代碼JVM,以使其捕獲Ctrl-C,然后根據需要運行關閉代碼。

多虧了這篇文章為我展示了光線,並感謝Stack的精彩“相關”問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM