2009-11-12 16 views
34

Uso el método de trabajo demorado con capistrano y me gustaría iniciar el trabajo con retraso en el inicio de la aplicación web con el comando 'script/delayed_job start'. De esta forma, capistrano puede reiniciarlo en el despliegue. Si el servidor se reinicia, mi demoyed_jobs debería comenzar con el proyecto.Inicio de la tarea de retraso en el inicio

¿Cómo puedo hacer esto? ¿Debería estar buscando hacerlo en los archivos de entorno o como un inicializador?

Respuesta

26

Debe crear una receta con el comando de reinicio.

namespace :delayed_job do 
    desc "Restart the delayed_job process" 
    task :restart, :roles => :app do 
     run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job restart" 
    end 
end 

Luego se agrega a ser ejecutado al final de su despliegue.

after "deploy:update_code", "delayed_job:restart" 
+0

ya tengo esta receta en mi Capistrano y que está funcionando. Mi pregunta estaba más relacionada con el reinicio del servidor. Actualmente he hecho un trabajo en el que en el arranque solo ejecuto un script en mi init.d y comienzo el daemon de demora de trabajo. Sin embargo, sería bueno tener eso como parte de mi aplicación. – map7

+3

Puede usar [god] (http://god.rubyforge.org/) para administrar el proceso y arrancarlo automáticamente cuando se inicie la máquina. –

+3

delayyed_job tiene su propio archivo recipes.rb que tiene la tarea anterior más o menos exactamente, más el trabajo demorado: inicio y trabajo retrasado: tareas de detención. –

32

En combinación con la receta Capistrano reinicio es muy cómodo de usar cron para iniciar también el demonio delayed_job en el arranque utilizando el @reboot momento especial en un crontab:

@reboot /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production script/delayed_job restart' 

Y es aún más conveniente junto con whenever a configurar una tarea programada:

job_type :envcommand, 'cd :path && RAILS_ENV=:environment :task' 

every :reboot do 
    envcommand 'script/delayed_job restart' 
end 

No estoy seguro si toda ejecución de cron en realidad sólo se ejecutan al iniciar el sistema @reboot pero al menos costuras a Ubuntu solo ejecútelos al inicio y no siempre que el cron daemon inicie o reinicie. Si pasa restart a script/delayed_job, probablemente funcione en ambos casos.

+0

También funciona en Debian Squeeze. –

+0

Esta es la solución más simple. Funciona en Ubuntu 12.04 bien. Amor crontabs. – Dex

7

Esto ahora trabaja con ambos carriles 2 y 3:

En deploy.rb, añadir las siguientes líneas:

require "delayed/recipes" 
set :rails_env, 'production' #added for delayed_job 
before "deploy:restart", "delayed_job:stop" 
after "deploy:restart", "delayed_job:start" 
after "deploy:stop", "delayed_job:stop" 
after "deploy:start", "delayed_job:start" 
Cuestiones relacionadas