Pytanie w sprawie clojure, clojure-java-interop, leiningen, shutdown-hook – hak zamykający nie uruchamia się podczas pracy z „lein run”

16

Mam następujący kod:

(ns test-hook.core)

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

oraz następujący projekt.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"]])

kiedy uruchomię go z „lein run”, hak zamykający zostanie wykonany tylko podczas normalnego wykonywania programu, a nie podczas odbierania SIGINT (Ctrl-C)

ten sam kod, gdy był uruchamiany poza leinem, z powodzeniem uruchamia hak zamykający nawet podczas odbierania SIGINT.

w jaki sposób mogę uruchomić hak zamykający podczas uruchamiania z lein i przerywania za pomocą Ctrl-C?

Twoja odpowiedź

1   odpowiedź
24

Czy próbowałeś go uruchomić z trampoliną?

lein trampoline run

Wydaje się działać dla mnie.

AFAIK „lein trampoline” nie zagnieżdża JVM, więc twój Ctrl-C nie został złapany przez leiningen, ale przez twój kod.

Pracowałem też dla mnie. Ktoś wieczemu trampolina jest naprawdę potrzebna? Nawet jeśli maszyny JVM są „zagnieżdżone”, Leiningen nadal zabija JVM aplikacji, co powinno wyzwolić haki wyłączania, chyba że jest to SIGKILL lub coś takiego. Wygląda na to, że patrząc na źródło LeinProcess#destroy() aby zakończyć zagnieżdżoną maszynę JVM, która wydaje się używać SIGTERM ... Jestem zdezorientowany. overthink
to działa doskonale, dziękuję. Samus_

Powiązane pytania