linux 为什么我不能关闭SSH连接时,已经分叉了一个进程与ruby?

igetnqfo  于 2022-12-11  发布在  Linux
关注(0)|答案(1)|浏览(116)

请考虑以下Ruby脚本:

fork do
  loop do
    sleep 1
  end
end

当我在通过SSH连接的Linux服务器上运行此脚本时,关闭SSH连接随后会挂起(我必须通过键入~ + RETURN退出它,否则连接会保持打开/挂起。我使用的是ruby 3.0.1p64,服务器操作系统是Fedora。
甚至在从派生进程分离时也会出现此问题:

pid = fork do
  loop do
    sleep 1
  end
end

Process.detach(pid)

解决这个问题的方法是将stdout和stderr重定向到/dev/null,但我需要父进程的输出可见,因此这不是一个可行的解决方案:

ruby script.rb < /dev/null >& /dev/null

为什么会这样?有什么办法吗?

ao218c7q

ao218c7q1#

找到了解决办法:

pid = fork do
  STDIN.reopen File.open("/dev/null", "r")
  null_out = File.open "/dev/null", "w"
  STDOUT.reopen null_out
  STDERR.reopen null_out

  loop do
    sleep 1
  end
end

相关问题