Pregunta sobre leiningen, clojure-java-interop, shutdown-hook, clojure – el gancho de apagado no se dispara cuando se ejecuta con "lein run"

16

Tengo el siguiente código:

(ns test-hook.core)

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

y el siguiente proyecto.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"]])

cuando lo ejecuto con "lein run", el gancho de apagado solo se ejecuta en la ejecución normal del programa, no cuando se recibe SIGINT (Ctrl-C)

el mismo código cuando se ejecuta fuera de lein ejecuta con éxito el gancho de apagado incluso cuando se recibe SIGINT.

¿Cómo puedo hacer que el gancho de apagado se ejecute cuando se ejecuta desde lein y se cancela con Ctrl-C?

Tu respuesta

1   la respuesta
24

¿Has probado correr con trampolín?

lein trampoline run

Parece funcionar para mi.

AFAIK "lein trampoline" no anida la JVM, por lo que su Ctrl-C no es atrapada por leiningen, sino por su código.

Eso funciona perfectamente, gracias. Samus_
Trabajó para mí también. Nadie sabepor qué El trampolín es realmente necesario? Incluso si las JVM están "anidadas", Leiningen todavía mata la JVM de la aplicación, lo que debería desencadenar sus ganchos de apagado, a menos que sea un SIGKILL o algo así. En cuanto a la fuente lein parece que usaProcess#destroy() para finalizar la JVM anidada, que parece usar SIGTERM ... Estoy confundido. overthink

Preguntas relacionadas