Ruby中如何在脚本关闭或按下Ctrl+C时执行指定函数?
Ruby中捕获脚本退出/ Ctrl+C执行特定操作的实现方法
在Ruby里,你可以通过信号捕获和退出钩子实现用户关闭脚本或按下Ctrl+C时执行特定操作,具体方案如下:
1. 捕获Ctrl+C(SIGINT信号)
用户在终端按下Ctrl+C会触发SIGINT中断信号,用Ruby的trap方法可以捕获这个信号并执行自定义逻辑:
def epic_function puts "User closed down the script" end # 捕获Ctrl+C触发的SIGINT信号 trap('INT') do epic_function exit # 执行完操作后主动退出,避免脚本继续运行 end # 示例主脚本逻辑 loop do puts "脚本运行中...按Ctrl+C退出" sleep 1 end
2. 覆盖所有非强制退出场景
如果要处理正常退出(脚本执行完毕、主动调用exit)和非强制终止信号(除SIGKILL外,该信号无法捕获),可以结合at_exit钩子:
def epic_function puts "User closed down the script" end # 捕获Ctrl+C trap('INT') do epic_function exit 1 # 用非0状态码标记异常退出 end # 脚本退出时触发的全局钩子 at_exit do # 避免Ctrl+C时重复执行epic_function unless $!.is_a?(Interrupt) epic_function end end # 示例主脚本逻辑 puts "脚本启动" sleep 5 puts "脚本正常执行完毕"
关键说明
trap('INT'):专门响应Ctrl+C的中断操作,确保用户主动终止时立即触发自定义逻辑。at_exit:无论脚本是正常结束还是被其他可捕获信号终止,都会执行这个钩子。加入$!.is_a?(Interrupt)判断是为了避免Ctrl+C场景下,自定义方法被trap和at_exit重复执行。- 注意:
SIGKILL(即kill -9命令)属于强制终止信号,无法被捕获,这种情况下自定义操作不会执行。
内容的提问来源于stack exchange,提问作者Erik77
相关产品推荐
相关产品推荐

