繁体   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