为什么Java的.addShutdownHook不适用于BeagleBone Black上的Ctrl-C?有解决方法吗?

时间:2014-10-27 07:13:59

标签: java ubuntu clojure beagleboneblack shutdown-hook

问题

我在我的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

P.S。对于那些熟悉Java但不熟悉Clojure的人来说,上面的Clojure代码只是通过它的互操作挂钩到Java方法。希望你可以测试trans

1 个答案:

答案 0 :(得分:0)

亲爱的......这里没有神秘感。我很懒,有点作弊,然后在我的Ubuntu机器上运行了lein exec而不是lein run(正如我在BBB上所做的那样)。显然,事情似乎有这样的表现......

关于如何获得所需行为的更多信息,lein trampoline run -m <ns>可以解决问题。问题似乎是因为使用lein run在嵌套的JVM中有效地运行应用程序,所以leiningen进程会捕获Ctrl-C而不是应用程序代码。使用lein trampoline分离应用程序代码JVM,使其捕获Ctrl-C,并根据需要运行关闭代码。

感谢this post向我展示了光线,而堆栈溢出则是一个很棒的“相关”问题。