区分命令行 Ruby 脚本信号的最佳方法

Best way to differentiate between signals for a command-line Ruby script

我有一个命令行 Ruby 脚本,我需要在其中区分不同的 SignalException。具体来说,我想捕获并忽略 control+c (SIGINT) 并在收到 control+\ (SIGQUIT).

时退出脚本

我对 Ruby 还是比较陌生,想知道实现我的目标的最佳(或规范)方法。我还想知道是否有可能 运行 变成 OS 差异(我目前在 OS X 上 运行 但我的解决方案是否适用于 Windows, Linux, 等等?)

我能够通过两种不同的方式获得可能信号的列表:

  1. 来自 bash:stty -a(这很好,因为它显示控制键组合)
  2. 通过 IRB:Signal.list

我是这样玩这些东西的:

#!/usr/bin/env ruby

while true

  begin

    puts "Spinning my wheels..."
    loop {}

  rescue Interrupt => e

    puts "\nCaught ^C - ignoring"

  rescue SignalException => e

    puts "\nCaught #{e.inspect}"

    if e.message == "SIGQUIT"
      puts "Shutting down..."
      exit
    end

  end

end

捕获信号的正确方法是 Signal.trap:

Signal.trap('QUIT') do
  puts "Shutting down..."
  exit
end

Signal.trap('INT', 'IGNORE')

链接文档对 OS 差异有一些评论,特别是:

The list of available signal names and their interpretation is system dependent. Signal delivery semantics may also vary between systems; in particular signal delivery may not always be reliable.