区分命令行 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, 等等?)
我能够通过两种不同的方式获得可能信号的列表:
- 来自 bash:
stty -a
(这很好,因为它显示控制键组合)
- 通过 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.
我有一个命令行 Ruby 脚本,我需要在其中区分不同的 SignalException。具体来说,我想捕获并忽略 control+c (SIGINT
) 并在收到 control+\ (SIGQUIT
).
我对 Ruby 还是比较陌生,想知道实现我的目标的最佳(或规范)方法。我还想知道是否有可能 运行 变成 OS 差异(我目前在 OS X 上 运行 但我的解决方案是否适用于 Windows, Linux, 等等?)
我能够通过两种不同的方式获得可能信号的列表:
- 来自 bash:
stty -a
(这很好,因为它显示控制键组合) - 通过 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.