Крюк выключения не срабатывает при работе с lein run

У меня есть следующий код:

(ns test-hook.core)

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

и следующий проект.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)

тот же код при запуске вне lein успешно выполняет хук выключения даже при получении SIGINT.

как я могу выполнить хук выключения при запуске из lein и прерывании с помощью Ctrl-C?


person Samus_    schedule 01.06.2012    source источник


Ответы (1)


Пробовали бегать на батуте?

lein trampoline run

Кажется, работает для меня.

AFAIK «lein trampoline» не вкладывает JVM, поэтому ваш Ctrl-C не улавливается leiningen, а вашим кодом.

person wink    schedule 02.06.2012
comment
Работал и для меня. Кто-нибудь знает, зачем действительно нужен батут? Даже если виртуальные машины JVM являются вложенными, Leiningen по-прежнему убивает JVM приложения, что должно спровоцировать его перехватчики выключения, если только это не SIGKILL или что-то в этом роде. Глядя на источник lein, кажется, что он использует Process#destroy() для завершения вложенной JVM, которая, похоже, использует SIGTERM... Я запутался. - person overthink; 25.11.2014