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