Прослушивание CTRL + C в Groovy Script - PullRequest
6 голосов
/ 13 января 2012

Можно ли слушать CTRL + C, когда в командной строке запускается отличный сценарий?

У меня есть скрипт, который создает некоторые файлы. В случае прерывания я хочу удалить их с диска, а затем прекратить.

Возможно

ОБНОВЛЕНИЕ 1: Получено из ответа @tim_yates:

def withInteruptionListener = { Closure cloj, Closure onInterrupt ->

    def thread = { onInterrupt?.call() } as Thread

    Runtime.runtime.addShutdownHook (thread)
    cloj();
    Runtime.runtime.removeShutdownHook (thread)

}

withInteruptionListener ({

    println "Do this"
    sleep(3000)

    throw new java.lang.RuntimeException("Just to see that this is also taken care of")
}, {
    println "Interupted! Clean up!"
})

Ответы [ 2 ]

12 голосов
/ 13 января 2012

Должно работать следующее:

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

Но очевидно, что эти классы не могут быть рекомендованы, поскольку они могут исчезнуть / изменить / переместить

2 голосов
/ 13 января 2012

Я не сильно разбираюсь в скриптах Groovy, но у меня есть ссылка, в которой есть несколько примеров и написано "перехватывать Ctrl + C .....". Надеюсь, это поможет http://pleac.sourceforge.net/pleac_groovy/processmanagementetc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...