Cómo crear un servicio en Linux con systemd
En el desarrollo de aplicaciones web, es frecuente que se deban llevar a cabo tareas de procesamiento en un script de ejecución asincrónico, programar tareas para más adelante o crear un demonio que se conecta directamente con los clientes a través de un socket. A pesar de que existen herramientas como servidores de cola de tareas, puede ser necesario crear nuestro propio servicio para obtener un nivel de flexibilidad que no se logra al depender de las restricciones de software de terceros.
En este artículo, se presentará un ejemplo de cómo convertir un programa en un servicio utilizando systemd y cómo configurarla adecuadamente para asegurarse de este siempre en funcionamiento.
Para comenzar, partimos de un sitio web de ejemplo, echo en Vite.js (https://vitejs.dev/) y cuyo comando de ejecución es:
npm run serve
Vamos a crear un archivo llamado /etc/systemd/system/vite.service:
[Unit]
# Proporciona una descripción breve del servicio que se está configurando.
Description = service vite up
# Especifica que el servicio se iniciará después de que se complete el arranque de la red.
After = network.target
[Service]
# Especifica la ruta del archivo ejecutable que se utilizará para iniciar el servicio.
ExecStart=/usr/local/bin/runvite.sh
# Especifica si se debe reiniciar automáticamente el servicio cuando se cierra inesperadamente.
Restart=always
# Especifica la cantidad de tiempo en segundos que el servicio debe esperar antes de intentar reiniciar después de cerrarse inesperadamente.
RestartSec=3
[Install]
# Especifica el nivel de ejecución en el que se iniciará el servicio. En este caso, el servicio se iniciará en el nivel de multi-usuario.
WantedBy = multi-user.target
Las opciones elegidas en nuestro archivo nos permiten asegurar que el proceso de vite.js en este caso, se mantenga siempre en ejecución, se puede encontrar más información en el siguiente enlace (https://www.freedesktop.org/software/systemd/man/systemd.service.html).
El archivo runvite.sh contiene el comando a ejecutar por parte del servicio, sin embargo, se ha colocado en la ruta /usr/local/bin debido a un asunto de permisos en el sistema operativo [status=203/EXEC], es posible encontrar más información en el siguiente enlace (https://unix.stackexchange.com/questions/472950/systemd-status-203-exec-error-when-creating-new-service), no olvidar el proporcionarle permisos de ejecución al script: chmod +x runvite.sh .
#!/bin/bash
cd /application/directory
npm run serve &
Una vez que se ha creado el archivo vite.service, se puede iniciar el servicio utilizando el siguiente comando:
$ systemctl start vite
Además, podemos hacer que el servicio se inicie automáticamente en el arranque de la maquina utilizando el comando:
systemctl enable vite
Como también verificar su estatus con:
systemctl status vite
Si desea realizar cambios en el archivo .service , debe volver a cargar las configuraciones, para asegurarse que systemd
reconoce los cambios utilice el siguiente comando:
systemctl daemon-reload
y reinicie el demonio:
systemctl restart vite
Eso es todo lo que se necesita para crear un servicio de Linux con systemd, escribir un pequeño archivo de configuración .service que haga referencia a su archivo con el comando a ejecutar.
Systemd ha sido el sistema de inicio predeterminado en RHEL/CentOS, Fedora, Ubuntu, Debian y otros desde hace varios años, por lo que es probable que su servidor esté listo para alojar sus servicios.