2015-11-27 4 views
1

В рубиновом процессе я развожу ребенка с системным вызовом в нем.Ruby Process.kill не может убить system() в рубиновом ребенке

Я хочу, чтобы иметь возможность убить ребенка и иметь, что распространяются на системный вызов, но системный вызов продолжает работать:

unless pid=fork 
    system("echo start ; sleep 1 ; echo 1 ; sleep 1 ; echo 2 ; sleep 1 ; echo 3") 
    exit 
end 
puts "Child: #{pid}" 

sleep 2 

Process.kill('-KILL',-pid) 

Как я могу распространять умерщвление от рубинового до это раздвоенный системный вызов?

+0

У меня аналогичная проблема, вы нашли решение этой проблемы в конце концов? – Calin

+0

К какой проблеме? Использование exec() решает основную проблему. –

+0

Не для меня http://stackoverflow.com/questions/41064139/terminating-a-ruby-fork-does-not-terminate-the-underlying-process – Calin

ответ

0

По-видимому, system блоки. Используйте exec вместо: http://ruby-doc.org/core-2.2.0/Kernel.html#method-i-exec

unless pid=fork 
    puts pid 
    exec("echo start ; sleep 1 ; echo 1 ; sleep 1 ; echo 2 ; sleep 1 ; echo 3") 
    exit 
    end 
    puts "Child: #{pid}" 

    sleep 1 

    Process.kill('KILL',pid) 
    puts 'killed' 
+0

Собственно, это не совсем ответит на вопрос. Если у меня есть скрипт ruby, который имеет «системный» вызов с, например, сном в нем, то я могу убить его с помощью ctrl-c (UNIX). Но я не могу убить системный вызов, отправив сигнал KILL на скрипт ruby. Это потому, что ctrl-c переходит к child/system() и отправляется из дочернего элемента? –

+0

Хмм, я не знаю, почему Process.kill не завершает дочерний процесс, извините. Теперь я проверил, что ctrl-C действительно завершает оба процесса при использовании 'system'. Вы можете отказаться принять мой ответ, если хотите. – Satya

+0

На самом деле, я просто оставлю его принятым, так как он помог мне разобраться, каков реальный вопрос: почему ctrl-c действует иначе, чем Process.kill Я предполагаю, что ctrl-c отправляется дочернему элементу, а не размножается родителем. –