#281 Foreman
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:
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.
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.