Creación y gestión de demonios en Linux usando SystemD

Clase 28 de 30Curso de Introducción a la Administración de Servidores Linux

Resumen

La gestión de demonios en Linux es una habilidad fundamental para cualquier administrador de sistemas. Estos procesos en segundo plano permiten que nuestro sistema operativo funcione de manera eficiente, ejecutando tareas críticas sin intervención directa del usuario. Dominar la creación y administración de demonios te dará un control más profundo sobre tu sistema Linux, permitiéndote automatizar tareas y crear servicios personalizados que se ejecuten según tus necesidades específicas.

¿Qué son los demonios en Linux y para qué sirven?

Los demonios son un mecanismo que tiene Linux para darle un comportamiento de servicio a los procesos. Esto significa que podemos configurarlos para que se inicien automáticamente al arrancar el sistema, bajo condiciones específicas y con comportamientos predeterminados.

Estos servicios se crean a través de archivos de configuración llamados "Unit Files", que definen cómo y cuándo debe ejecutarse un demonio. Un caso de uso común es cuando necesitamos que un script (por ejemplo, en Python) se ejecute constantemente realizando una función específica sin intervención manual.

El primer y más importante demonio en Linux es SystemD, que funciona como el gestor principal de todos los demás demonios del sistema. SystemD es responsable de iniciar componentes críticos como:

  • Drivers de red
  • Entorno gráfico
  • Servicios esenciales del sistema operativo

Para interactuar con SystemD, utilizamos SystemCTL (System Control), que proporciona una interfaz para gestionar los demonios y servicios del sistema.

¿Cómo crear y configurar un demonio personalizado?

Para demostrar el proceso de creación de un demonio, vamos a implementar un simple script de Python que funcione como un logger básico, registrando la fecha actual cada segundo en un archivo.

Preparando el script

Primero, necesitamos crear nuestro script de Python:

import time
from datetime import datetime

while True:
    file = open('/date_logs/timestamp.txt', 'a')
    file.write(f"Timestamp: {datetime.now()}\n")
    file.close()
    time.sleep(1)

Este script simplemente:

  1. Abre un archivo en modo append (añadir)
  2. Escribe la fecha y hora actual
  3. Cierra el archivo
  4. Espera un segundo antes de repetir el proceso

Configurando el entorno

Para que nuestro script funcione correctamente, debemos:

  1. Verificar que Python esté instalado:
python3 -V
  1. Crear el directorio donde se guardarán los logs:
mkdir /date_logs
  1. Crear un directorio para nuestros scripts:
mkdir /root/scripts
  1. Guardar nuestro script en la ubicación adecuada:
vim /root/scripts/logger.py

Creando el Unit File

El Unit File es la configuración que SystemD utilizará para gestionar nuestro demonio. Debemos crearlo en la ubicación correcta:

vim /etc/systemd/system/loggerPython.service

Y añadir el siguiente contenido:

[Unit]
Description=Python Logger
After=multi-user.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /root/scripts/logger.py

[Install]
WantedBy=multi-user.target

Este archivo de configuración tiene tres secciones principales:

  1. [Unit]: Contiene metadatos y dependencias

    • Description: Una descripción simple del servicio
    • After: Indica que este servicio debe iniciarse después del target especificado
  2. [Service]: Define el comportamiento del servicio

    • Type: Especifica el tipo de proceso (simple, forking, oneshot, etc.)
    • Restart: Determina cuándo reiniciar el servicio (always, on-failure, etc.)
    • ExecStart: El comando que se ejecutará para iniciar el servicio
  3. [Install]: Configura cómo se instala el servicio

    • WantedBy: Especifica en qué target debe incluirse este servicio

Activando y gestionando el demonio

Una vez creado el Unit File, debemos recargar SystemD para que reconozca los cambios:

systemctl reload

Para habilitar el servicio para que se inicie automáticamente al arrancar el sistema:

systemctl enable loggerPython.service

Para iniciar manualmente el servicio:

systemctl start loggerPython.service

Para verificar el estado del servicio:

systemctl status loggerPython.service

Para detener el servicio:

systemctl stop loggerPython.service

Para deshabilitar el inicio automático:

systemctl disable loggerPython.service

¿Cómo funcionan los targets y niveles de ejecución?

En SystemD, los targets son similares a los niveles de ejecución (runlevels) en sistemas SysV init tradicionales. El target multi-user.target que utilizamos en nuestro ejemplo se activa después de que todos los servicios esenciales (red, drivers, etc.) se han iniciado, permitiendo el acceso a una consola de texto.

Los targets definen puntos específicos en el proceso de arranque y determinan qué servicios deben estar activos en cada etapa. Esto permite una gestión más granular y flexible de los servicios del sistema.

Dominar la creación y gestión de demonios en Linux te permitirá automatizar tareas, crear servicios personalizados y tener un mayor control sobre tu sistema. ¿Has creado algún demonio personalizado para alguna tarea específica? Comparte tu experiencia en los comentarios y explora otras posibilidades para aprovechar esta potente característica de Linux.