我有一个 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 接受分叉。