system和fork调用阻塞了端口3000

时间:2009-11-17 16:42:49

标签: ruby-on-rails ruby

我正在使用ruby 1.8.7和rails 2.3.4。我正在开发一个插件,所以我没有太多的余地。

在我的控制器中,我需要调用rake任务。 rake任务需要更长的时间才能完成,因此我遵循Railscast中提到的方法

system "rake #{task} &"

此解决方案效果很好,一切都很好。我知道这个解决方案不适用于Windows,我很好。

我在端口3000启动了我的服务器。调用了控制器,它在后台触发了rake任务。但是,如果我ctrl + c我的脚本/服务器,如果我尝试重新启动服务器,那么我会收到此错误。

地址已在使用中 - bind(2)(Errno :: EADDRINUSE)

然后我改变了我的代码来执行此操作

fork do
 system "rake #{task} &"
end

仍然是同一个问题。

有没有人如何解决端口3000阻塞的问题?另外,为什么rake任务阻塞端口3000的任何解释都会有所帮助。

1 个答案:

答案 0 :(得分:3)

来自ruby-docs

Kernel.fork [{block}] => fixnum或nil

Process.fork [{block}] => fixnum或nil

  

创建子流程。如果是块   指定,该块在中运行   子进程和子进程   终止状态为零。   否则,fork调用返回   两次,一次在父母身边,返回   孩子的进程ID,一次   在孩子身上,归零。孩子   进程可以使用Kernel.exit退出!至   避免运行任何at_exit函数。   父进程应该使用Process.wait来收集   其子女的终止状况   或使用Process.detach进行注册   他们的地位不感兴趣;   否则,操作系统可能会   累积僵尸进程。

线程调用fork是创建的子进程中唯一的线程。 fork不会复制其他线程。 最终解决方案基于以下评论:

command = "rake #{task} #{args.join(' ')}" 
p1 = Process.fork { system(command) } 
Process.detach(p1)