Должно работать следующее:
CLEANUP_REQUIRED = true
Runtime.runtime.addShutdownHook {
println "Shutting down..."
if( CLEANUP_REQUIRED ) {
println "Cleaning up..."
}
}
(1..10).each {
sleep( 1000 )
}
CLEANUP_REQUIRED = false
Как видите, (как указывает @DaveNewton), "Shutting down..."
будет напечатано, когда пользователь нажмет CTRL-C, или процесс завершится нормально,поэтому вам понадобится какой-то метод определения необходимости очистки
Обновление
Ради любопытства, вот как вы можете это сделать, используя неподдерживаемые классы sun.misc
:
import sun.misc.Signal
import sun.misc.SignalHandler
def oldHandler
oldHandler = Signal.handle( new Signal("INT"), [ handle:{ sig ->
println "Caught SIGINT"
if( oldHandler ) oldHandler.handle( sig )
} ] as SignalHandler );
(1..10).each {
sleep( 1000 )
}
Но очевидно, что эти классы не могут быть рекомендованы, поскольку они могут исчезнуть / изменить / переместить