2012-06-04 400 views
11

Capistrano的任務啓動後臺進程

namespace :service do 
    desc "start daemontools (svscan/supervise/svscanboot)" 
    task :start, :roles => :app do 
    sudo "svscanboot&" 
    end 
end 

現在,這並不工作:svscanboot過程根本就不運行。 這幫我找到sleephttps://github.com/defunkt/resque/issues/284 其他來源指出我nohup,redirectionpty => true,所以我嘗試了所有這些。

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 &" # NO 
run "(svscanboot&) && sleep 1"      # NO 
run "(nohup svscanboot&) && sleep 1"     # YES! 

現在,有誰能向我解釋爲什麼我需要睡眠聲明和nohup有什麼區別嗎? 爲了記錄所有上述運行同樣好,如果從用戶shell運行,問題只在capistrano的上下文中。

感謝

+0

'nohup'確保您的命令在shell終止後收到'SIGHUP'信號時不會終止。不過,我也很好奇爲什麼睡眠命令會有所作爲。 – Graeme

+0

睡眠對我的世界也有影響。 Capistrano這麼簡單的任務爲何如此驚人地困難,這很神祕。 – cbmanica

+0

我看到相同的行爲。並想知道同樣的事情。 – aslakjo

回答

0

我認爲nohup只是在後臺啓動進程,所以你不需要明確設置最後一個&。

你嘗試

run "nohup svscanboot >/tmp/svscanboot.log 2>&1"

(沒有結束&將其發送到後臺)。

當你目前的capistrano會議結束時,這應該工作並保持運行。

0

試試這個

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 & sleep 5", pty: false 
0

我想與大家分享我的解決方案執行多個命令時也可以工作。我嘗試了許多其他在線發現的變體,包括「睡眠N」黑客。

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true) 
1

我的簡單解決方案是在遠程服務器上用任何代碼運行svscanboot.sh文件。在你的情況

svscanboot >/tmp/svscanboot.log 2>&1 

在帽rake任務添加此

run "sh +x somefile.sh &" 

這很適合我。

相關問題