我在我的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
答案 0 :(得分:0)
lein exec
而不是lein run
(正如我在BBB上所做的那样)。显然,事情似乎有这样的表现......
关于如何获得所需行为的更多信息,lein trampoline run -m <ns>
可以解决问题。问题似乎是因为使用lein run
在嵌套的JVM中有效地运行应用程序,所以leiningen进程会捕获Ctrl-C而不是应用程序代码。使用lein trampoline
分离应用程序代码JVM,使其捕获Ctrl-C,并根据需要运行关闭代码。
感谢this post向我展示了光线,而堆栈溢出则是一个很棒的“相关”问题。