2016-02-24 64 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 
相關問題