是否可以忽略 Ruby 中的 SIGHUP?

Is it possible to ignore SIGHUP in Ruby?

我想创建一个 Ruby 脚本,它将像这样开始:

$ ruby script.rb &

然后,我将关闭控制台,它必须保持活动状态,在后台工作。目前我必须像这样 运行 来实现:

$ nohup ruby script.rb &

我想摆脱 nohup 并直接在脚本中处理 SIGHUP -- 直接忽略它。可能吗?

当然,只是 Signal.trap HUP 信号:

def do_fork
  $pid = fork do
    Signal.trap("HUP") do
      puts "Received HUP, ignoring..."
    end
    Signal.trap("TERM") do
      puts "Received TERM, terminating..."
      exit(0)
    end
    while true do sleep(10_000) end
  end

  Process.detach($pid)
end

do_fork

将上面的代码复制到某个文件,然后 运行 使用 ruby file.rb 以查看它会忽略 kill -HUP pid 并在 kill -TERM pid 上关闭。