homeASCIIcasts

281: Foreman 

(view original Railscast)

Other translations: En Ja He Fr

Other formats:

Written by Juan Lupión

Hace poco Ryan Bates preguntó en Twitter cuál es la mejor manera de gestionar los procesos en segundo plano que necesita una aplicación Rails en desarrollo. En este episodio veremos la solución que le propusieron varios lectores: Foreman.

Por ejemplo, para la aplicación GoVsGo en desarrollo tenemos que lanzar de antemano varios procesos en segundo plano: Beanstalkd, un proceso script/worker y un servidor Faye. Tenemos que arrancar todo esto cada vez que queramos usar la aplicación en desarrollo, así que sería mucho mejor si hubiera una forma más sencilla de gestionar todos estos procesos. Aquí es donde interviene Foreman.

Foreman: instalación y uso

Foreman se instala como es habitual con el resto de gemas.

$ gem install foreman

Foreman lee los procesos que tiene que gestionar a partir de un fichero llamado Procfile en el directorio de la aplicación Rails, por lo que primero tenemos que crearlo. Cada proceso se define mediante un nombre y dos puntos, así como la ruta del proceso que queremos ejecutar, por lo que para nuestros tres procesos haremos lo siguiente:

/Procfile

beanstalk:  beanstalkd
worker:     ./script/worker
faye:       rackup faye.ru -s thin -E production

Una vez que hayamos escrito nuestro Procfile podemos comprobar su validez ejecutando foreman check.

$ foreman check
valid procfile detected (beanstalk, worker, faye)

Si utilizamos tabuladores en lugar de espacios para separar el nombre del ejecutable propiamente dicho veremos mensajes de aviso, lo que tendremos que tener en cuenta. Si el fichero es válido podemos ejecutar Foreman con la orden foreman start.

$ foreman start
20:06:35 beanstalk.1  | started with pid 23140
20:06:35 worker.1     | started with pid 23141
20:06:35 faye.1       | started with pid 23143
20:06:36 faye.1       | >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
20:06:36 faye.1       | >> Maximum connections set to 1024
20:06:36 faye.1       | >> Listening on 0.0.0.0:9292, CTRL+C to stop
20:06:38 worker.1     | [2011-08-29 20:06:38 +0100] Working 1 jobs: [ Game.move ]

Se ejecutarán cada uno de los procesos que hayamos especificado en el Procfile y su salida aparecerá en el terminal. Si escribimos CTRL+C en la ventana de terminal, se pararán todos los procesos.

Foreman dispone de una página de manual que documenta su funcionalidad y las opciones disponibles, algunas de las cuales veremos a continuación. Si sólo queremos arrancar un proceso podemos pasar su nombre directamente:

$ foreman start faye
20:35:41 faye.1       | started with pid 23322
20:35:41 faye.1       | >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
20:35:41 faye.1       | >> Maximum connections set to 1024
20:35:41 faye.1       | >> Listening on 0.0.0.0:9292, CTRL+C to stop

Si queremos arrancar múltiples copias de un proceso podemos hacerlo con -c. Por ejemplo, podemos ejecutar cuatro procesos en segundo plano de Beanstalk con foreman start -c worker=4.

$ foreman start -c worker=4
20:39:41 beanstalk.1  | started with pid 23366
20:39:41 worker.1     | started with pid 23368
20:39:41 worker.2     | started with pid 23370
20:39:41 worker.3     | started with pid 23372
20:39:41 worker.4     | started with pid 23374
20:39:41 faye.1       | started with pid 23376
20:39:42 faye.1       | >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
20:39:42 faye.1       | >> Maximum connections set to 1024
20:39:42 faye.1       | >> Listening on 0.0.0.0:9292, CTRL+C to stop
20:39:46 worker.3     | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ]
20:39:46 worker.1     | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ]
20:39:46 worker.2     | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ]
20:39:47 worker.4     | [2011-08-29 20:39:47 +0100] Working 1 jobs: [ Game.move ]

Exportación de procesos

Con Foreman disponemos de una orden export que es útil para exportar el listado de procesos en formato inittab o upstart que podemos utilizar en un servidor de producción. Si ejecutamos foreman export upstart . Foreman escribirá los ficheros de configuración necesarios para upstart en el directorio actual. Si le echamos un vistazo veremos que ejecutará la orden necesaria para arrancar un servidor beanstalkd, gestionando correctamente los logs.

/govsgo-beanstalk-1.conf

start on starting govsgo-beanstalk
stop on stopping govsgo-beanstalk
respawn

exec su - govsgo -c 'cd /Users/eifion/govsgo; export PORT=5000; beanstalkd >> /var/log/govsgo/beanstalk-1.log 2>&1'

Con esto concluye nuestro episodio sobre Foreman. Ha sido un poco más breve que de costumbre, pero porque Foreman es una solución muy sencilla para un problema específico que hace bien su trabajo. Si tenemos que arrancar varios procesos para que nuestra aplicación Rails se encuentre operativa en modo de desarrollo, Foreman es una opción que merece la pena considerar.