由Ctrl + C终止时要运行的命令

时间:2011-11-30 05:34:22

标签: ruby

当用户使用Control + c终止整个脚本时,是否会保留一个保留的命令名?例如,如果我想在脚本终止时执行puts "Script terminated by user.",我该怎么办呢?

4 个答案:

答案 0 :(得分:3)

trap("INT") do
  puts "Script terminated by user."
  exit
end

sleep 10

运行此命令,然后点击ctrl-c。

答案 1 :(得分:2)

Kernel.trap方法可用于指定信号处理程序。

答案 2 :(得分:0)

在其他两个答案的帮助下,我在Kernel中查找了一些相关的方法,并发现还有其他一些方法:

trap(0){puts "Script terminated by user."}

at_exit{puts "Script terminated by user."}

答案 3 :(得分:0)

我发现这是退出脚本的更优雅方式。如果您想要干净地退出并确保脚本保持一致状态,这非常有用。

http://futuresimple.github.com/posts/2012-02-24-graceful-exiting-from-console-programs-in-ruby/

require "singleton"

class GracefulQuit
  include Singleton

  attr_accessor :breaker

  def initialize
    self.breaker = false
  end

  def self.enable
    trap('INT') {
      yield if block_given?
      self.instance.breaker = true
    }
  end

  def self.check(message = "Quitting")
    if self.instance.breaker
      yield if block_given?
      puts message
      exit
    end
  end

end

然后你可以在你的剧本中写下这个:

require 'graceful_quit'
GracefulQuit.enable{puts "Exit signal received..."}
puts "Control-C to exit"

while(true)
   ...
   # something that you want to make sure finishes before you exit
   ...
  GracefulQuit.check("Done.")
  sleep(10)
end