gpt4 book ai didi

linux - 如何阻止 Ctrl-C 使用 jruby 杀死生成的进程?

转载 作者:太空狗 更新时间:2023-10-29 11:23:07 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com