2016-02-24 32 views
0
清理停业/僵尸进程或接近长期运行POPEN与西纳特拉

我有以下的在我的红宝石西纳特拉应用流的即时它工作得很好,但每个请求留下解散/僵尸背后大tar文件子进程。只要浏览器弹出保存文件对话框,该过程就会失效。如何在彪马

我对彪马2.12.2运行此

我已经尝试了系统调用,并在使用块代替POPEN但它关闭tar命令完成之前的过程和收益,因此客户端接收空的文件。

任何想法如何我可以自动清理已停用的子进程或保留对io对象的句柄,但仍然返回它,因此它开始流式传输到客户端?

get '/:dir_name' do 
    headers['Content-Type']="application/octet-stream" 
    headers["Content-Disposition"]="attachment;filename=#{params[:dir_name]}.tar" 
    IO.popen("tar -C /home/my/files -cf - #{params[:dir_name]}") 
end 

回答

1

上面的代码似乎产生了两个子进程:一个用于正确关闭的tar命令;另一个不存在。

当popen在下面的代码中被分离时,不会出现停用的进程,并且tar命令仍然作为服务器的子级保持正确连接。

get '/:dir_name' do 
    headers['Content-Type']="application/octet-stream" 
    headers["Content-Disposition"]="attachment;filename=#{params[:dir_name]}.tar" 
    io = IO.popen("tar -C /home/my/files -cf - #{params[:dir_name]}") 
    Process.detach(io.pid) 
    return io 
end 
相关问题