我正在使用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的任何解释都会有所帮助。
答案 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)