2011-05-10 81 views
11

我必須在後臺運行一個命令,但我希望能有適當的轉義,它的參數。執行shell命令用正確的參數逃避

system("rake send_mails subject='#{params[:subject]}' 2> /dev/null 1> /dev/null &"); 

如果我寫system("rake", "send_mails", params[:subject])然後我沒有「到位」爲重定向和&標誌。如果我不這樣做,我不會爲subject參數轉義。

我怎樣才能解決這個問題?

+0

我不知道,但你嘗試拼圖'system'電話?例如:'system(system(「rake」,「send_mails」,params [:subject]),「/ dev/null 1>/dev/null&」) – fl00r 2011-05-10 11:11:26

+0

然後執行內部system()外'系統()'失敗,不執行任何操作:'類型錯誤:不能轉換成真正String' – Notinlist 2011-05-10 11:24:50

回答

19

在Ruby 1.9,嘗試Process.spawn

# Spawn a new process and run the rake command 
pid = Process.spawn({"subject" => params[:subject]}, 
        "rake", "send_mails", 
        :out => 'dev/null', :err => 'dev/null') 

# Detach the spawned process 
Process.detach pid 
+0

點是不再等待。我們必須繼續處理下一個網絡查詢 - 因爲我沒有提及它。但是,這是將輸出重定向到'/ dev/null'並使用'&'運行 - 以達到完全分離的關鍵。 – Notinlist 2011-05-10 11:50:41

+1

然後在生成新進程後使用Process.detach。我將編輯我的答案以包含此內容。 – 2011-05-10 12:03:14

+1

並稱'Process.fork做... end'可用,並且貼近完美的1.8.7。 – Notinlist 2011-05-10 12:08:08