Ответ 1
Я не знаю, применил ли Clojure метод для этой цели. В java вы можете использовать Runtime.addShutdownHook()
Регистрирует новый крюк отключения виртуальной машины.
Виртуальная машина Java отключается в ответ на два вида событий:
Программа завершается нормально, когда последний поток не-daemon выходит или когда вызывается метод exit (эквивалентно, System.exit) или
Виртуальная машина завершается в ответ на прерывание пользователя, например, набирает ^ C или общесистемное событие, такое как выключение пользователя или выключение системы.
Update
Вот простая демонстрация
(.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] (println "Shutting down..."))))
user=> ;; Ctrl-C
Shutting down...