使用"lein run"运行时,shutdown hook不会触发

Sam*_*us_ 17 clojure leiningen shutdown-hook clojure-java-interop

我有以下代码:

(ns test-hook.core)

(defn -main []
  (.addShutdownHook (Runtime/getRuntime) (Thread. #(println "shutdown")))
  (println "start")
  (doseq [i (range 1 6)]
    (Thread/sleep 1000)
    (println i)))
Run Code Online (Sandbox Code Playgroud)

以及project.clj

(defproject test-hook "1.0.0-SNAPSHOT"
  :aot :all
  :main test-hook.core
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.2.0"]])
Run Code Online (Sandbox Code Playgroud)

当我使用"lein run"运行它时,关闭钩子仅在正常程序执行时执行,而不是在接收SIGINT时执行(Ctrl-C)

在lein外部运行时相同的代码即使在接收到SIGINT时也会成功执行shutdown hook.

如何从lein运行并使用Ctrl-C中止时执行关闭挂钩?

小智 25

你试过用蹦床运行吗?

lein trampoline run
Run Code Online (Sandbox Code Playgroud)

似乎为我工作.

AFAIK"lein trampoline"没有嵌套JVM,所以你的Ctrl-C不是由leiningen捕获的,而是由你的代码捕获的.

  • 也为我工作过.有人知道*为什么*真的需要蹦床?即使JVM是"嵌套的",Leiningen仍会杀死应用程序的JVM,它应该触发它的关闭钩子,除非它是一个SIGKILL或其他东西.看看lein源它似乎使用`Process#destroy()`来结束嵌套的JVM,它似乎使用了SIGTERM ......我很困惑. (10认同)