【问题标题】:Ruby Process.kill can't kill system() in ruby childRuby Process.kill 无法杀死 ruby​​ child 中的 system()
【发布时间】:2016-03-01 11:11:30
【问题描述】:

在一个 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)

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

【问题讨论】:

标签: ruby process kill-process sigkill


【解决方案1】:

显然,system 块。请改用exechttp://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'

【讨论】:

  • 实际上,这并不能完全回答问题。如果我有一个 ruby​​ 脚本,其中有一个“系统”调用,例如,其中有一个 sleep,那么我可以用 ctrl-c (UNIX) 杀死它。但是我不能通过向 ruby​​ 脚本发送 KILL 信号来终止系统调用。是不是因为 ctrl-c 转到 child/system() 并且是从 child 发送过来的?
  • 嗯,我不知道为什么 Process.kill 没有终止子进程,抱歉。现在,我检查了 ctrl-C 在使用system 时确实终止了这两个进程。如果您愿意,可以不接受我的回答。
  • 实际上,我会接受它,因为它帮助我弄清楚真正的问题是什么 - 为什么 ctrl-c 的行为不同于 Process.kill 我猜 ctrl-c 已发送给孩子而不是被父母传播。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多