Pergunta sobre leiningen, clojure, shutdown-hook, clojure-java-interop – gancho de desligamento não dispara ao executar com "lein run"

16

Eu tenho o seguinte 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)))

e o seguinte projeto.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"]])

quando eu o executo com "lein run" o gancho de desligamento só é executado na execução normal do programa, não quando estiver recebendo o SIGINT (Ctrl-C)

o mesmo código, quando executado fora de lein, executa com sucesso o gancho de encerramento, mesmo quando recebe SIGINT.

Como posso ter o gancho de desligamento executado ao executar a partir de lein e abortar com Ctrl-C?

Sua resposta

1   a resposta
24

Você já tentou executá-lo com trampolim?

lein trampoline run

Parece funcionar para mim.

AFAIK "lein trampoline" não aninha a JVM, então o seu Ctrl-C não é capturado pelo leiningen, mas pelo seu código.

Trabalhou para mim também. Ninguem sabeporque trampolim é realmente necessário? Mesmo se as JVMs estiverem "aninhadas", Leiningen ainda mata a JVM do aplicativo, o que deve acionar seus ganchos de desligamento, a menos que seja um SIGKILL ou algo assim. Olhando para a fonte lein parece usarProcess#destroy() para terminar a JVM aninhada, que parece usar o SIGTERM ... Estou confuso. overthink
isso funciona perfeitamente, obrigado. Samus_

Perguntas relacionadas