2009-07-10 10 views
19

Per la mia app RubyOnRails devo avviare un lavoro in background alla fine della distribuzione di Capistrano. Per questo, ho provato quanto segue in deploy.rb:Avvio delle attività in background con Capistrano

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true 

volte questo funziona, ma il più delle volte non si avvia il processo di (= non compresi ps -aux). E non ci sono messaggi di errore. E non c'è nohup.out, non nella directory home e non nella directory dell'app rails.

Ho provato a usare trap ('SIGHUP', 'IGNORE') in scheduler.rb invece di nohup, ma il risultato è lo stesso.

L'unico modo per farlo funzionare è rimuovere ": pty => true" e fare un Ctrl-C manuale alla fine di "cap deploy". Ma non mi piace ...

Ci sono altre possibilità di richiamare questo Scheduler.start? O per ottenere altri messaggi di errore?

sto usando Rails 2.3.2, 2.5.8 Capistrano, Ubuntu Hardy sul server

+0

Eventuali suggerimenti? Continua a combattere con il riavvio del processo in background qui ... –

risposta

1

volete che il vostro lavoro di pianificazione per eseguire continuamente in background e ottenere riavviato quando si esegue Capistrano?

Se è così, allora per che io uso runit http://smarden.sunsite.dk/runit/ e DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. Installare runit nella modalità di non sostituire init
  2. Aggiungi il tuo processo in background come servizio runit e aggiungere il monitor di registro per esso da runit.
  3. Avere Capistrano chiama sudo sv kill job_name per uccidere e riavviare il lavoro.

Il mio lavoro di backround è un'istanza del plugin Rails DelayedJob che gestisce le attività di background Rails. Lo uccido con ogni schieramento di Capistrano, quindi verrà riavviato con il codice aggiornato.

Questo ha dimostrato di essere molto affidabile.

HTH,

Larry

+0

Sì, lo scheduler dovrebbe essere eseguito continuamente in background e dovrebbe essere riavviato su ogni distribuzione. Sto usando DelayedJob nello scheduler e alcune cose personali. Perché l'avvio tramite script/runner funziona a volte con Capistrano (e sempre se lo avvio manualmente tramite una sessione SSH) Penso che ci sia solo un piccolo problema con Capistrano - e quindi non voglio passare a runit, se non è davvero necessario ... Ma grazie mille per anwer, Larry! –

+0

E il riavvio automatico dopo il riavvio? Questo è qualcos'altro di cui runit si prende cura. - Plus riavvia se mai muore. Saluti. –

+0

@Georg: Se ti piace la risposta di Larry, ti preghiamo di revocare l'autorizzazione allo –

14

Con: pty => true, utente di shell script di avvio (ad esempio bashrc, etc.) sono (di solito) non caricato. Il mio programma ruby ​​è uscito subito dopo l'avvio a causa della mancanza di variabili di ambiente dipendenti.

Senza: pty => true, come descritto nella domanda, capistrano rimane in attesa del processo di uscita. Dovrai reindirizzare sia stdout che stderr per farlo tornare immediatamente.

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good. 

Se l'attività in background non viene ancora eseguita. Prova a reindirizzare stdout e stderr in un file di log in modo da poter esaminare l'output.

+1

Ho faticato per un'intera giornata con esattamente lo stesso problema. Reindirizzare l'output come suggerito ha risolto il problema. – randomuser

1

Se questa utilità di pianificazione ha un opzione -d funzionerà. Ad esempio, il passeggero autonomo ha un'opzione -d per avviarlo come processo demonizzato.

namespace :passenger_standalone do 
    task :start do 
    run "cd #{current_path} && passenger start -e #{rails_env} -d" 
    end 
    task :stop do 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop" 
    end 
    task :restart do 
    stop 
    start 
    end 
end 
6

Mi piacerebbe condividere la mia soluzione che funziona anche quando si eseguono 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) 

Questa è una risposta DUP launching background process in capistrano task ma vuole fare in modo gli altri e me può google per questa soluzione.

+0

Questo mi ha aiutato. Grazie. –