3

我有一个 ruby​​ 程序,产生新的进程。即使我按下 Ctrl-C,我也希望它们能在它们的父级中存活下来。为此,我尝试捕获 INT,但是,这无济于事。

下面的程序在每次按下回车时启动一个 xeyes,如果你写任何东西就退出,如果你按下 Ctrl-C 然后返回应该退出。

  • 如果我以正常方式退出,xeyes 会幸存下来。
  • 如果我按 Ctrl-C,xeyes 就会死掉。
  • 跟踪 xeyes,它确实收到了 SIGINT,而不是建议的 SIGHUP。

我该怎么做才能让我的 xeyes 活着?

该程序:

#!/usr/bin/jruby
require 'readline'

keep_at_it = true

trap("INT") { puts "\nCtrl-C!" ; keep_at_it = false }

while (keep_at_it) do
  line = Readline.readline("Enter for new xeyes, anything else to quit: ", true)
  if (line.length == 0 && keep_at_it == true)
    Thread.new { system("nohup xeyes >/dev/null 2>/dev/null") }
  else
    keep_at_it = false
  end
end

我也一直在使用 ruby​​ 进行测试,但是由于我需要仅适用于 jruby 的 JMX 支持,因此我不能按原样使用 ruby​​。以下方式适用于红宝石:

fork { Process.setsid; exec("xeyes") }

'Process setsid' 似乎确保没有控制终端,我怀疑这是中心。但是,即使使用 -J-Djruby.fork.enabled=true 标志,我也无法让 jruby 接受分叉。

4

1 回答 1

0

只有父进程被杀死SIGINT,子进程正在死亡,因为它们正在被发送一个SIGHUP表明其父进程已经死亡的信号。nohup尝试通过命令启动 xeyes 。它将防止SIGHUP信号终止它启动的进程。

Thread.new { system("nohup xeyes") }
于 2011-04-07T13:28:42.310 回答