У меня есть рубиновая программа, порождающая новые процессы. Я хочу, чтобы они пережили своего родителя, даже когда я нажимаю Ctrl-C. Для этого я пытаюсь перехватить INT, но это не помогает.
Приведенная ниже программа запускает xeyes каждый раз, когда вы нажимаете Enter, завершает работу, если вы что-то пишете, и должна завершиться, если вы нажмете 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, доступная только в jruby, я не могу использовать ruby как есть. В ruby работает следующий способ:
fork { Process.setsid; exec("xeyes") }
«Процесс setsid», кажется, гарантирует, что нет управляющего терминала, и я подозреваю, что это центральное. Однако мне не удается заставить jruby принять вилку, даже используя флаг -J-Djruby.fork.enabled=true.