Para gestionar los procesadores en Linux existen sistemas de inicialización como systemd. Si necesitas una solución más sencilla, un programa que pueda gestionar los procesos de tu aplicación, ya sea en el sistema o en un contenedor Docker. Tal programa existe - es supervisor. Es un gestor de procesos de código abierto funcionalmente simple escrito en Python, que se puede utilizar para ejecutar tantas copias de un proceso como sea necesario y supervisar su estado. A continuación le mostraremos cómo instalar y configurar Supervisor usando Ubuntu 20.04 como ejemplo.
La forma más sencilla de obtener el programa es instalarlo desde los repositorios oficiales. Para ello, debe ejecutar el comando:
$ sudo apt install supervisor
Si quieres que el programa se ejecute todo el tiempo, tienes que añadirlo a tu autoloader y ejecutarlo. Ejecutar:
$ sudo systemctl enable supervisor --now
A continuación, puedes ver el estado mediante el comando:
$ sudo systemctl status supervisor
El archivo de configuración se encuentra en /etc/supervisor/supervisord.conf.
Aquí también se encuentran los ajustes básicos. Es mejor utilizar el directorio /etc/supervisor/conf.d/
para configurar los procesos en ejecución .
El archivo de configuración principal puede dejarse por defecto. Veamos cómo crear ficheros de configuración para programas. La sintaxis de una sección para un único proceso tiene el siguiente aspecto:
variable nombre valor
Para cada proceso es necesario pasar dichas variables para que se inicie automáticamente y se recupere tras un fallo:
directory
- directorio de trabajo;
command
- comando para iniciar el proceso; user
- usuario, en nombre del cual se iniciará el proceso;
autostart
- si el proceso debe iniciarse automáticamente; autorestart
- si el proceso debe reiniciarse;
Sin embargo, hay muchos más ajustes disponibles, aquí están algunos de ellos que serán discutidos en este artículo:
priority
- prioridad del proceso a iniciar;
environment
- variables de entorno que se pasarán al proceso;
stdout_logfile
- donde redirigir la salida stdout del proceso;
stderr_logfile
- dónde redirigir la salida stderr del proceso; process_name
- nombre del proceso, con posibilidad de sustituir el número de copia;
numprocs
- número de copias del proceso a iniciar;
startretries
- número de intentos para iniciar el programa;
redirect_stderr
- redirige la salida de error del proceso a la salida del supervisor;
redirect_stdout
- redirige la salida del proceso a la salida del supervisor.Para una mejor comprensión y ejemplo, vamos a ejecutar un script PHP que se quedará colgado en segundo plano:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Puede crear un fichero de configuración del supervisor independiente para el proceso. Puede insertar la configuración justo al final del archivo de configuración principal, pero es mejor no hacerlo. Es mejor crear un fichero de configuración separado para cada programa en /etc/supervisor/conf.d/
con el nombre *.conf. Por ejemplo, para este programa este archivo tendrá este aspecto:
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
A continuación, debe reiniciar el supervisor, esto se puede hacer con systemctl:
$ sudo systemctl restart supervisor
O con la utilidad supervisorctl
:
$ sudo supervisorctl reload
También puede ver el estado de los procesos configurados mediante el comando:
Si el proceso está en estado RUNNING, todo está bien y se inició con éxito. Pero en este caso el proceso se está ejecutando en una única instancia, y muy a menudo es necesario ejecutar varias copias del mismo proceso. Para ello podemos utilizar los parámetros process_name
y numprocs
. El primero permite modificar el nombre del proceso para que contenga el número de copia, y el segundo permite especificar cuántas copias deben ejecutarse.
La variable nombre_proceso
suele contener un patrón de formato de cadena python que contiene el nombre del programa y el número de proceso: %(nombre_programa)s_%(numero_proceso)02d
. Aquí el nombre de la variable va entre paréntesis, seguido de su tipo. Por ejemplo, para ejecutar el mismo programa en cuatro hilos, el fichero de configuración debería tener esta forma:
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
Ahora tenemos que recargar supervisorctl
de nuevo y se estarán ejecutando 4 procesos:
$ sudo supervisorctl status
Al mismo tiempo es posible guardar todos los datos de salida del programa en el fichero log. Para ello se utilizan los parámetros stdout_logfile
y stderr_logfile
. Por ejemplo, puede guardar el archivo de registro de su ejecución directamente en la carpeta con el programa.
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
stdout_logfile=/home/sergiy/program/process.log
stderr_logfile=/home/sergiy/program/process.log.error
Después de reiniciar el servicio, los registros aparecerán en la carpeta con el programa:
Del mismo modo, si desea redirigir
la salida de sus procesos a la salida estándar del supervisor, deberá utilizar los parámetros redirect_stderr
y redirect_stdout.
Si su programa necesita variables de entorno, puede introducirlas utilizando el parámetro environment. Las variables deben escribirse con comas. Por ejemplo:
$ environment=DISPLAY=":1",HOME="/root"
Después de cada cambio de configuración, recuerde reiniciar supervisor para aplicar los cambios. La utilidad supervisorctl puede utilizarse para controlar procesos. Como ya se ha dado cuenta, para ver la lista de procesos es necesario ejecutarla:
$ sudo supervisorctl status
Luego, conociendo el nombre del proceso, puede reiniciarlo, por ejemplo proceso:proceso_00
:
$ sudo supervisorctl restart process:process_00
Detener:
$ sudo supervisorctl stop process:process_00
O iniciarlo:
$ sudo supervisorctl start process:process_00
Alternativamente, puede conectarse al proceso y ver lo que emite a stdout/stderr
utilizando el comando fg
:
$ sudo supervisorctl fg process:process_00
Hemos visto cómo se configura el supervisor
y cómo utilizar el software de gestión de procesos.