【发布时间】:2012-01-07 16:29:26
【问题描述】:
我有一个 ruby 超时,它调用这样的系统(bash)命令..
Timeout::timeout(10) {
`my_bash_command -c12 -o text.txt`
}
但我认为即使ruby线程被中断,实际命令仍然在后台运行..正常吗?怎样才能杀死它?
【问题讨论】:
-
这不是真的。当父 ruby 进程终止时,运行命令的子 shell 应该终止。请举一个更具体的例子。
-
@BenLee: 超时后父进程不会终止。
-
@MladenJablanović,在一个快速的实验中它确实如此。我创建了一个 ruby 文件,除了:
require 'timeout'; Timeout::timeout(100) {sleep 500` }. While running it, I dops aux | grep sleep` 并查看睡眠过程。然后我将 SIGKILL 发送到 ruby 进程,并再次运行ps aux | grep sleep并且不再看到子进程。 -
@BenLee:请重新阅读我上面的评论。谢谢。
-
其实Mladen是对的,到了timeout时父进程并没有终止(除非运行命令后无事可做)。发生的事情是引发了 Timeout::Error 异常,仅此而已。子外壳仍在运行。即使父(ruby)进程在抛出异常后终止,启动的shell命令仍在运行,它只是从ruby进程重新分配给PID为1的进程作为它的子进程。至少这是在 Mac OSX 上发生的事情。
标签: ruby process timeout terminate