Ruby Process.kill can';t kill system()在ruby child中

Ruby Process.kill can';t kill system()在ruby child中,ruby,process,kill-process,sigkill,Ruby,Process,Kill Process,Sigkill,在ruby进程中,我用一个系统调用派生一个孩子 我希望能够杀死孩子并将其传播到系统调用,但系统调用仍在运行: 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) 如何将kill从ruby传播到它的分叉系统调用?显然,sy

在ruby进程中,我用一个系统调用派生一个孩子

我希望能够杀死孩子并将其传播到系统调用,但系统调用仍在运行:

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)

如何将kill从ruby传播到它的分叉系统调用?

显然,
system
块。改用
exec


事实上,这并不能完全回答这个问题。如果我有一个ruby脚本,它有一个“系统”调用,例如,其中有一个sleep,那么我可以用ctrl-c(UNIX)杀死它。但是我不能通过向ruby脚本发送kill信号来终止系统调用。这是因为ctrl-c转到child/system()并且它是从child发送的吗?嗯,我不知道为什么Process.kill没有终止子进程,对不起。现在,我检查了ctrl-C是否确实在使用
system
时终止了这两个进程。如果你愿意,你可以取消接受我的答案。事实上,我会让它被接受,因为它帮助我弄清了真正的问题是什么-为什么ctrl-c的行为不同于Process.kill我猜ctrl-c是发送给孩子的,而不是由家长传播的。我有一个类似的问题,你最终找到解决这个问题的办法了吗?哪个问题?使用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'