¿Cómo Crear un Servicio Personalizado en Systemd en Linux?

Systemd es un potente y versátil sistema de inicialización para distribuciones de Linux. Puede ejecutar programas, gestionar recursos del sistema e incluso controlar el estado de tu computadora.

En este artículo, te mostraré cómo usar Systemd para controlar tus aplicaciones mediante la creación de una unidad de servicio personalizada en Ubuntu.

¿Qué es una Unidad de Servicio Systemd?

Una unidad de servicio es un archivo regular que contiene detalles sobre cómo ejecutar una aplicación específica. Incluye metadatos generales sobre el programa, cómo ejecutarlo y si Systemd puede acceder a él en una sesión regular.

Por defecto, cada daemon en una máquina basada en Systemd tiene algún tipo de archivo de servicio.

Por ejemplo, OpenSSH usa la unidad ssh.service en “/etc/systemd/system/” para determinar cómo se ejecutará en Debian y Ubuntu.

A nivel básico, un archivo de unidad de servicio está compuesto por tres partes: Unit, Service e Install.

  • La sección Unit proporciona los metadatos y las dependencias de la aplicación.
  • La sección Service define dónde se encuentra la aplicación y cómo Systemd la ejecutará.
  • Finalmente, la sección Install describe cuándo puede Systemd iniciar la aplicación.

Creando un Servicio Personalizado a Nivel de Sistema

Uno de los usos más comunes para un servicio personalizado es automatizar comandos que requieren privilegios de root o aprovechar los temporizadores de Systemd.

Por ejemplo, un servicio personalizado ayuda a asegurar que un servidor de Minecraft se inicie correctamente después de un reinicio.

Para crear un servicio personalizado a nivel de sistema en Linux, comienza creando el archivo de unidad de Systemd en el directorio de tu usuario:

nano ~/my-system-app.service

Pega el siguiente bloque de código dentro de tu nuevo archivo de unidad. Este es el archivo de configuración más simple y válido para un servicio de Systemd:

[Unit]
Description=My First Service
After=network.target

[Service]
Type=simple
ExecStart=/path/to/bin
Restart=always

[Install]
WantedBy=multi-user.target

Reemplaza la variable Description con los detalles de tu servicio a nivel de usuario. Reemplaza la variable ExecStart con la ruta completa del programa que deseas ejecutar.

Guarda el archivo y luego cópialo al directorio de servicios de tu máquina:

sudo cp ./my-system-app.service /etc/systemd/system/

Ejecuta el siguiente comando para reiniciar el demonio de Systemd:

sudo systemctl daemon-reload

Prueba tu nuevo servicio de nivel de sistema ejecutando el siguiente comando:

sudo systemctl start my-system-app.service

Por último, confirma que tu nuevo servicio se está ejecutando correctamente comprobando su estado en systemctl:

systemctl status my-system-app.service

Creando un Servicio Personalizado a Nivel de Usuario

Las unidades de servicio no están limitadas a aplicaciones a nivel de sistema o superusuarios. Con la ayuda de Systemd-user, es posible crear servicios sin root.

Esto permite a los usuarios no root gestionar aplicaciones locales, mejorando la seguridad de su PC al limitar los programas con acceso root.

Para crear tu servicio personalizado a nivel de usuario en Linux, haz un nuevo archivo de unidad de Systemd en el directorio de tu usuario:

nano ~/my-user-app.service

Pega el siguiente bloque de código dentro de tu nuevo archivo de unidad:

[Unit]
Description=My First User Service
After=graphical-session.target

[Service]
Type=simple
ExecStart=/path/to/bin

[Install]
WantedBy=default.target

Reemplaza el valor de la variable ExecStart con la ruta del programa que deseas ejecutar. Como se trata de un servicio a nivel de usuario, asegúrate de que tu cuenta de usuario tenga acceso adecuado al binario.

Guarda el archivo de servicio a nivel de usuario y luego crea el directorio local de Systemd para tu usuario:

mkdir -p ~/.config/systemd/user/

Copia tu nuevo archivo de servicio a este directorio local de Systemd para tu usuario:

cp ./my-user-app.service ~/.config/systemd/user/

Asegúrate de que Systemd revise el directorio de tu usuario en busca de nuevos archivos de unidad de servicio:

systemctl daemon-reload --user

Por último, confirma que tu nuevo servicio está funcionando correctamente comprobando su estado en systemctl:

systemctl --user status my-user-app.service

Modificando Tu Servicio Personalizado en Systemd

Una de las fortalezas clave de Systemd es que te permite personalizar completamente cómo ejecutar y gestionar programas.

Añadiendo Variables de Entorno a un Servicio Personalizado

Las variables de entorno son una parte importante de cualquier sistema Linux. Proporcionan datos adicionales a un programa sin necesidad de modificar archivos de configuración.

Con Systemd, es posible hacer uso de variables de entorno incorporándolas a tus unidades de servicio.

Comienza deshabilitando el servicio que deseas modificar:

systemctl --user disable --now my-user-app.service

Abre tu archivo de servicio personalizado con tu editor de texto favorito:

sudo nano ~/.config/systemd/user/my-user-app.service

Desplázate a la sección “[Service]” y agrega la siguiente línea de código justo debajo de la variable Type=:

Environment=""

Añade la variable de entorno que deseas agregar a tu servicio personalizado. En mi caso, quiero agregar una variable EDITOR para asegurarme de que mi servicio vea mi instancia de Vim.

Guarda tu archivo de servicio modificado, luego recarga el demonio de Systemd para aplicar los cambios:

systemctl daemon-reload --user

Reinicia tu nuevo servicio de Systemd para usar tu nueva variable de entorno:

systemctl --user start my-user-app.service

Limitando el Consumo de Recursos de una Unidad de Servicio

Además de modificar las variables de entorno y los usuarios, Systemd también puede limitar los recursos que una aplicación puede consumir durante su vida útil.

Aunque no lo hace por defecto, es posible controlar partes esenciales como el uso de la CPU y la cantidad general de procesos.

Comienza deshabilitando completamente el servicio que deseas modificar.

Abre el archivo de unidad de servicio con tu editor de texto favorito:

sudo nano /etc/systemd/system/my-system-app.service

Desplázate a la sección “[Service]” y añade la variable para el recurso que deseas limitar. Por ejemplo, agregar la variable MemoryHigh= te permitirá establecer un límite suave de memoria para ese servicio.

Guarda el archivo de unidad, luego recarga el servicio de Systemd:

sudo systemctl enable --now my-system-app.service

Finalmente, puedes monitorear tus servicios en ejecución ejecutando:

systemd-cgtop

Conclusión

Aprender a crear servicios personalizados de Systemd y modificarlos según tus necesidades es solo el primer paso para entender esta herramienta tan versátil.