【问题标题】:shutdown hook doesn't fire when running with "lein run"使用“lein run”运行时不会触发关闭挂钩
【发布时间】:2012-06-01 18:31:06
【问题描述】:

我有以下代码:

(ns test-hook.core)

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

以及下面的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"]])

当我使用“lein run”运行它时,关闭挂钩只会在正常程序执行时执行,而不是在接收 SIGINT (Ctrl-C) 时执行

即使在接收到 SIGINT 时,在 lein 之外运行的相同代码也会成功执行关闭挂钩。

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

【问题讨论】:

    标签: clojure leiningen shutdown-hook clojure-java-interop


    【解决方案1】:

    你试过用蹦床跑吗?

    lein trampoline run
    

    似乎对我有用。

    AFAIK "lein trampoline" 不会嵌套 JVM,因此您的 Ctrl-C 不会被 leiningen 捕获,而是被您的代码捕获。

    【讨论】:

    • 也为我工作。有谁知道为什么蹦床真的需要吗?即使 JVM 是“嵌套的”,Leiningen 仍然会杀死应用程序的 JVM,这应该会触发其关闭挂钩,除非它是 SIGKILL 或其他什么。查看 lein 源,它似乎使用 Process#destroy() 来结束嵌套的 JVM,这似乎使用 SIGTERM ...我很困惑。
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-09-14
    • 2016-07-22
    相关资源
    最近更新 更多