2012-06-04 10 views
11

Capistrano compitolancio processo in background nel compito Capistrano

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

Ora, questo non funziona: il processo di svscanboot semplicemente non funziona. Questo mi ha aiutato a trovare sleep: https://github.com/defunkt/resque/issues/284 altre fonti mi ha indirizzato a nohup, redirection e pty => true, quindi ho provato tutti questi.

Ora, qualcuno potrebbe spiegarmi perché ho bisogno della dichiarazione di sonno e che differenza fa nohup? Per la registrazione tutto quanto sopra funziona ugualmente bene se eseguito da shell utente, il problema è solo nel contesto di capistrano.

grazie

+0

'nohup' garantisce che il comando non termini quando riceve il segnale' SIGHUP' dopo che la shell termina. Tuttavia, sono anche curioso di sapere perché il comando del sonno fa la differenza. – Graeme

+0

Anche il sonno fa la differenza nel mio mondo. È stupefacente il motivo per cui un compito tanto semplice è così incredibilmente difficile con Capistrano. – cbmanica

+0

Vedo lo stesso comportamento. E chiedendo anche la stessa cosa. – aslakjo

risposta

0

Penso che nohup avvia il processo in background, quindi non è necessario impostare in modo esplicito l'ultimo &.

Hai provato

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

(senza il finale & per inviarlo allo sfondo).

Questo dovrebbe funzionare e rimanere in esecuzione quando viene chiusa la sessione corrente di capistrano.

0

Prova questa

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

Mi piacerebbe condividere la mia soluzione che funziona anche durante l'esecuzione di più comandi. Ho provato molte altre varianti trovate online, incluso il trucco "sleep 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

La mia soluzione semplice sarebbe rendere il file svscanboot.sh al server remoto con qualsiasi codice che si desidera eseguire. Nel tuo caso

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

a Cap task rake aggiungere questo

run "sh +x somefile.sh &" 

questo funziona bene per me.