Qué es el supervisord
En unix un sistema de control de procesos básicamente es un programa, que nos permite la manipulación de nuestro servicios, esto ya se para iniciar un servicio, detener al servicio reiniciar etc.
Por ejemplo, imaginemos que tenemos instalado mysql y reiniciamos el servidor, lo que pasaría es que automáticamente después del reinicio un sistema de control de procesos iniciaría automáticamente el servicio de mysql, con esto nosotros nos evitamos el tener que iniciar todos los procesos dentro del servidor de manera manual.
Dentro de estos sistemas nos encontramos con muchas soluciones, una de ellas y a mi parecer la más popular es systemd, si bien entre systemd y supervisord hay muchas diferencias, podríamos ver cierta similitud entre ambas.
Ahora bien, entonces qué es el supervisor, el supervisor es un sistema cliente/servidor que permite a los usuarios controlar procesos dentro de un sistema unix, la principal diferencia entre systemd y supervisor que este último está orientado a los procesos del usuario.
Un claro ejemplo de uso, es cuando trabajamos con el framework Laravel, específicamente con colas, si tienes un poco de conocimiento en el framework recordarás que para ejecutar a una cola, debemos de ejecutar el comando
php artisan queue:work &
El cual comenzará con el procesamiento de las colas, el problema de esto es que si por alguna razón el proceso falla o simplemente reiniciamos el servidor, este comando dejará de ejecutarse, con lo cual ninguna cola se ejecutaría, para resolver esto podemos usar el supervisor, el cual en este caso sería el encargado de ejecutar el comando queue:work en dado caso esté falle o bien si llegamos a reiniciar el servidor.
Para comenzar a trabajar con el supervisor debemos de instalarlo, para este ejemplo usaré a ubuntu, entonces únicamente debemos de ejecutar
sudo apt-get install supervisor -y
Al instalar el supervisor este nos genera una carpeta dentro de /etc llamada supervisor
cd /etc/supervisor/
Dentro de la cual nos encontramos con una carpeta llamada conf.d, dentro de esta carpeta definiremos los archivos de configuración para cada proceso que necesitemos.
Para esto entonces vamos a proceder a crear un archivo de configuración para manejar a nuestro comando de ejecución de colas
sudo touch /etc/supervisor/conf.d/laravel-worker.conf
Como siguiente paso procederemos a editar este archivo y definir la configuración, dentro de todo proceso en el supervisor deberemos de definir un nombre descriptivo para nuestro programa, esto lo hacemos al inicio del archivo definiendo lo siguiente
[program:x]
en dónde program es una palabra reservada y X será el nombre que le demos a nuestro servicio, por ejemplo program:laravel-worker
La otra configuración requerida es llamada command el cual será el comando a ejecutar.
[program:x]
command=path_to_project/php artisan queue:work
Es entonces dentro de command en donde deberemos de definir el comando que queremos ejecutar, por ejemplo un script de python ruby etc, en este caso el comando queue:work
Otro apartado importante de la configuración básica es definir el apartado llamado process_name el cual definiremos el nombre del proceso dentro del supervisor, en la documentación podemos ver el la siguiente estructura
[program:x]
process_name=%(program_name)s_%(process_num)02d
Esto lo que hará será asignarle el nombre de la variable X que definimos arriba, junto con _00 esto nos sirve ya que muchas veces necesitaremos ejecutar a múltiples procesos de la misma instancia y al ejecutar múltiples instancias el contador se incrementa automáticamente es decir _01, _02 etc.
Como parte final de la configuración básica nos encontramos con la siguiente
autostart=true
autorestart=true
user=localuser
Los 2 primeros campos hacen referencia a ejecutar el comando cuando iniciamos o reiniciamos el servidor, y autorestart nos sirve para reiniciar el comando en dado caso este falle, y el apartado de user, nos sirve para indicarle al supervisor con que usuario debemos de ejecutar nuestro comando.
Con esto entonces ya tendríamos la configuración básica, como último paso debemos de ejecutar al servicio, para esto el supervisor viene integrado con una utilidad llamada supervisorctl, con la cual podremos interactuar con nuestro servicios.
Para entonces iniciar a nuestro servicio debemos de ejecutar
sudo supervisorctl restart
Una vez ejecutado este comando, ya tendríamos activo a nuestro servicio para ver a los servicios activos podemos ejecutar
sudo supervisorctl status
y deberíamos ver
laravel-worker:laravel-worker_00