[英]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.