Como iniciar uma tarefa de rake usando upstart

7

Estou tentando configurar um trabalhador de Resque como um script de inicialização do Upstart para ser usado pelo Monit em um aplicativo Rails. Eu não sou um administrador e eu tentei escrever isso usando exemplos de outro script de init que temos em nosso servidor, aqui está o que eu tenho:

start on startup
stop on shutdown

pre-start script
   cd /var/www/my-app/current
end script

script
   exec bundle exec rake environment resque:work RAILS_ENV=staging PIDFILE=/var/run/resque.pid QUEUE=sync >> /var/log/resque.log
end script

Mas isso não funciona, se eu tentar sudo start resque eu recebo:

resque start/running, process XXXX

Nada está sendo iniciado, tanto quanto eu sei, não há nenhum processo de Resque a ser encontrado nem há arquivo de log. Eu estou completamente perdido em como fazê-lo funcionar.

Atualizar : Encontrei o arquivo syslog e ele diz:

Nov  4 17:20:09 fantasysports init: resque main process (3057) terminated with status 2

Atualização : Eu tentei executá-lo usando sudo (sim, isso não faz sentido!) e removi o redirecionamento de saída para o arquivo de log e agora recebo um código de status diferente:

Nov  4 17:29:44 fantasysports init: resque main process (3276) terminated with status 10

Atualização : Acabou abandonando o Upstart para o init.d, pois start-stop-daemon é muito melhor documentado e me dá controle total sobre o que está acontecendo.

    
por Nicolas Buduroi 04.11.2011 / 22:07

3 respostas

5

Veja como eu faço isso ... isso também adiciona no rvm

start on startup
stop on starting rcS

chdir /data/pusher/current
env RAILS_ENV=production
script
  /usr/local/bin/rvm-shell '1.9.2@app' -c 'JOBS_PER_FORK=25 RAILS_ENV=production QUEUE=app_production bundle exec rake --trace resque:work >> /data/app/current/log/app-worker.production.log 2>&1'
end script

Edit: aqui está como eu faço isso para rodar como um usuário diferente .. chdir não parece ser honrado .. então é meio hacky

start on runlevel [2345]
stop on starting rcS

chdir /data/app/current
env RAILS_ENV=production
script
        sudo -u user -s -- "cd /data/app/current; export RAILS_ENV=production; /usr/local/bin/rvm-shell '1.9.2-p180@app' -c 'QUEUE=app_production bundle exec rake resque:work >> /data/app/current/log/app-worker.production.log 2>&1'"
end script

Você praticamente precisa mudar para o diretório correto e definir o RAILS_ENV no comando sudo

    
por 04.11.2011 / 22:34
2

Você pode querer olhar para o Foreman: link que tem a capacidade de exportar para o upstart e é recomendado para gerenciar trabalhadores de resque em vários posts, incluindo este: link

    
por 05.11.2011 / 19:21
1

A maneira que o manual do RVM, na seção "integração", recomenda para " Usando serviços baseados em RVM e Ruby que iniciam via init.d ou upstart "é usar aliases e wrappers RVM.

Eu tive uma situação em que tive que monitorar um processo bluepill . Este processo é um daemon, portanto, um processo que se bifurca 2 vezes. Iniciá-lo com o comando rvm-shell adicionou uma terceira bifurcação ... O que fez com que o Upstart não conseguisse rastrear o processo PID ( pode rastrear o máximo de processos até a segunda bifurcação - quando for dada a sub-rotina expect daemon ).

Eu resolvi isso da seguinte maneira:

  1. Primeiro, criei um alias de RVM para meu ambiente:

    rvm alias create my_app ruby-2.0.0-p247@my_app

  2. Então eu usei a seguinte configuração upstart para o meu trabalho:

    # /etc/init/bluepill_my-app.conf

description "my_app Bluepill"

start on runlevel [2]
stop on runlevel [016]

setuid my-app
setgid my-app

expect daemon
respawn

env USER=my-app
env HOME=/var/www/my-app/
env RAILS_ENV=my-app
env BLUEPILL_BASE_DIR=/tmp/bluepill_my-app

chdir /var/www/my-app/current/

exec /var/www/my-app/.rvm/wrappers/my-app/bundle exec bluepill --no-privileged load  /var/www/my-app/current/config/deploy/monitoring/my-app.pill >> /tmp/upstart.log 2>&1

'

O Bundler precisa ser instalado no gemset fornecido para o qual o alias do RVM está apontando.

A chamada do script de wrapper bundler não causa nenhum garfo como o comando rvm-shell .

Uma alternativa poderia ser instalar o bluepill gem no gemset usado, criar um script wrapper para ele e usá-lo diretamente sem o bundle exec - assim como o manual do RVM sugere - mas usá-lo via bunlder permite arquivos bluepill .pill para usar qualquer biblioteca usada no meu aplicativo (como setingslogic etc.).

Isso ficou um pouco fora do assunto, mas acho que é um bom exemplo de como fazer melhor. Espero que isso ajude.

    
por 14.03.2014 / 15:13