当从命令行运行groovy脚本时,是否可以侦听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!"
})
答案 0 :(得分:12)
以下内容应该有效:
CLEANUP_REQUIRED = true
Runtime.runtime.addShutdownHook {
println "Shutting down..."
if( CLEANUP_REQUIRED ) {
println "Cleaning up..."
}
}
(1..10).each {
sleep( 1000 )
}
CLEANUP_REQUIRED = false
正如你所看到的,(正如@DaveNewton指出的那样),当用户按下CTRL-C时会打印"Shutting down..."
,或者进程正常结束,所以你需要一些方法来检测是否清理是需要
为了好奇,以下是使用不受支持的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 )
}
但显然,不建议使用这些类,因为它们可能会消失/更改/移动
答案 1 :(得分:2)
我对groovy脚本并不多,但我有一个链接,有一些例子,并说捕捉ctrl + c .....希望有帮助http://pleac.sourceforge.net/pleac_groovy/processmanagementetc.html