我有一个 ruby 程序,生成新进程。我希望即使在我按下 Ctrl-C 时,它们也能在它们的父对象中存活下来。为此,我 try catch INT,但是,这没有帮助。
下面的程序会在您每次按下 enter 时启动一个 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 进行测试,但由于我需要 JMX 支持,而 JMX 支持仅适用于 jruby,因此我无法按原样使用 ruby。以下方法适用于 ruby:
fork { Process.setsid; exec("xeyes") }
'Process setsid' 似乎确保没有控制终端,我怀疑这是中央。但是,即使使用 -J-Djruby.fork.enabled=true 标志,我也无法让 jruby 接受 fork。
最佳答案
只有父进程被 SIGINT
杀死,子进程正在死亡,因为它们收到了一个 SIGHUP
信号,表明它们的父进程已经死亡。尝试通过 nohup
命令启动 xeyes。它将防止 SIGHUP
信号杀死它启动的进程。
Thread.new { system("nohup xeyes") }
关于linux - 如何阻止 Ctrl-C 使用 jruby 杀死生成的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5578039/