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

标签 linux exception-handling jruby sigint

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

相关文章:

linux - Linux中套接字缓冲区(skb)中数据的DMA

c++ - 当另一个线程正在读/写 fd 时,我可以调用 posix_fadvise 吗?

linux - 如何通过 crontab -e 运行我的 bash 脚本

php - Laravel 5 - 我如何处理 MethodNotAllowedHttpException

java - Java 中的 Ruby 解析器

Tomcat 7 上的 java.lang.OutOfMemoryError : Java heap space deploying . war

linux - 如何在 Linux Bash 中将变量内的值添加到一起?

c++ - 为什么VC++引入非标准关键字: __leave?

c# - InvalidCastException Dictionary<string, string> 使用 Exception.Data

ruby - RSpec Gem 似乎没有安装依赖项