Вопрос по – Отключающий крюк не срабатывает при работе с «lein run»

16

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

(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)

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

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

Ваш Ответ

1   ответ
24

Вы пытались запустить его на батуте?

lein trampoline run

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

AFAIK "батут лейн" не внедряет JVM, поэтому ваш Ctrl-C не перехватывается leiningen, но вашим кодом.

У меня тоже сработало. Кто-нибудь знаетwhy батут действительно требуется? Даже если JVM являются "вложенными" Лейнинген по-прежнему убивает JVM приложения, которая должна запускать его крюки отключения, если только это не SIGKILL или что-то в этом роде. Глядя на источник lein, он, кажется, используетProcess#destroy() завершить вложенную JVM, которая, кажется, использует SIGTERM ... Я в замешательстве.
это работает отлично, спасибо. Samus_

Похожие вопросы