2015-07-10 57 views
1

我有一個命令行Ruby腳本,我需要區分不同的SignalException s。具體而言,我想捕獲並忽略control + c(SIGINT),並在收到控件+ \(SIGQUIT)時退出腳本。區分命令行Ruby腳本信號的最佳方法

我還是比較新的Ruby,想知道最好(或規範)的方式來實現我的目標。我也想知道是否有可能遇到操作系統差異(我目前在OS X上運行,但是我的解決方案是否可以在Windows,Linux等上運行?)

我能夠獲得

  1. 從慶典:兩種不同的方式可能信號stty -a(這是很好的,因爲它顯示的控制鍵組合技)通過IRB
  2. 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 

回答

3

信號捕獲正確的方法是用Signal.trap

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

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

鏈接的文檔對操作系統差異的一些意見,具體如下:

可用的信號名稱和列表的解釋是依賴於系統的。信號傳遞語義也可能因系統而異;特別是信號傳遞可能並不總是可靠的。

+0

謝謝!這就是我開始的方式,但是爲了拯救語義學,它更容易閱讀。我一定會改回來的。 – RobertJoseph