Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Cómo crear y gestionar demonios en Linux con systemd

Imago voragine.net
[actualizado el ]

Un demonio en Linux, y de manera general en cualquier sistema tipo UNIX, es un proceso que se ejecuta en segundo plano y es autónomo, de manera que no necesita interacción por parte de un usuario del sistema para arrancar y funcionar. Los servidores web Apache o Nginx están controlados por demonios, por ejemplo.

Los demonios son útiles para hacer funcionar programas independientes de una sesión de usuario, procesos que se inicien de manera automática cuando el sistema arranca, servicios que permanecen a la escucha para ejecutar su tarea cuando son llamados.

En este artículo se explica cómo crear un demonio en un sistema Debian Jessie funcionando con systemd, el gestor de demonios.

Definir y configurar el demonio con systemd: unit files

En systemd los demonios se definen y configuran en los llamados archivos de unidad, unit files. Estos archivos se alojan en /etc/systemd/system/. Por ejemplo, vamos a crear un demonio que se encargue de iniciar y vigilar un hipotético script (volver a iniciarlo si se para, reiniciarlo cuando el sistema se reinicie…). Para ello usaremos lo que en el argot de systemd se llama service, unit files con extensión .service:

# ***UnDemonio.service***
[Unit]
Description=La descripción del demonio
After=multi-user.target

[Service]
Type=simple
ExecStart=/ruta/hasta/el/script
User=usuario
WorkingDirectory=/ruta/hasta/la/carpeta/del/script
Restart=on-failure
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Este unit file iniciará el script indicado con la opción ExecStart bajo el usuario usuario. Si el script falla o se para, se intentará reiniciar como indica la opción Restart. Las opciones StandardOutput y StandardError aseguran que la salida estándar y de errores del script se escribirán en el log de systemd.

Para conocer en detalle la estructura y las opciones de los unit files de systemd se puede consultar la documentación en la página de Red Hat.

Activar y controlar el demonio: la orden systemctl

Ya tenemos el demonio definido y configurado en /etc/systemd/system/undemonio.service. Ahora vamos a incluirlo en la secuencia de arranque y a activarlo:

sudo systemctl daemon-reload
sudo systemctl enable undemonio.service
sudo systemctl start undemonio.service

La orden systemctl permite controlar los servicios del sitema: incluir un nuevo servicio en la secuencia de arranque con la opción enable, iniciarlo con la opción start, pararlo con stop…

Autor

23 comentarios

    • Por Sara Padilla •

    Hola estoy siguiento tu tutorial pero tengo conflicto con estas dos lineas en el código:
    ExecStart=/ruta/hasta/el/script
    WorkingDirectory=/ruta/hasta/la/carpeta/del/script

    1. Hola Sara,

      supongamos que el script que quieres asociar al demonio está en /home/usuario/bin/script.py

      En este caso ExecStart y WorkingDirectory tendrían los siguientes valores:

      ExecStart=/home/usuario/bin/script.py
      WorkingDirectory=/home/usuario/bin

      Comprueba que los permisos del directorio y el script están correctamente configurados para el usuario que ejecuta el script, definido con User.

    • Por Nani Silverstone •

    Vaya! nunca crei encontrar un tutorial tan bien explicado en español! muchas gracias por tu ayuda, ahora muchas cosas me quedaron muy claras!

    • Por PabloMart •

    gracias por la información, la verdad que muy bien explicado

    un saludo

    • Por Juan •

    Hola, oye y el script puede ser un .sh?, debe llevar alguna estructura? (Soy nuevo en Linux)

    1. Hola Juan,

      el script puede ser un .sh, sí. Puede estar programado en lo que quieras: python, php, perl, bash…

    • Por dani •

    Hola,

    ¿Como puedo hacer para que el demonio salte cuando desconecto/conecto un periférico?

    1. Hola dani,

      los demonios están siempre escuchando. Y los periféricos en Linux son accesibles desde en una ubicación dentro de la carpeta /dev.

      En el script que asocies al demonio puedes comprobar, por ejemplo, con un loop infinito el estado de la ubicación del periférico hasta que cambie.

    • Por Izay •

    Hola que tal en mi caso quiero instalar el demonio «Quagga» en una distribución de Debian, pero al descargar dicho demonio, para continuar con el proceso me pide buscar algunos ficheros los cuales no encuentra.
    A continuación te muestro la respuesta que me aparece:

    No se puede efectuar `stat` sobre `/usr/share/ doc/quagga/examples/* ` :No existe el fichero o directorio.

    Y al buscarlo en la carpeta de instalación no me aparece ningún archivo de ejemplo dentro de la carpeta «Quagga»
    Te agradecería bastante si me pudieras auxiliar.

    1. Hola Izay, tu problema no tiene que ver con lo que se explica en este tutorial. Es un problema de instalación o configuración de Quagga. Quizás puedas solucionarlo en foros especializados en ese software.

    • Por Juan Fernando Gonzalez •

    Al ejecutar la linea para avilitar el demonio sudo systemctl enable undemonio.service obtengo el siguiente error:
    Failed to issue method call: Bad message

    Este es la configuracion

    ***UnDemonio.service***
    [Unit]
    Description=»ip detection»
    After=multi-user.target

    [Service]
    Type=simple
    ExecStart=/home/juan.gonzalez/control.sh
    User=root
    WorkingDirectory=/home/juan.gonzalez/
    Restart=on-failure
    StandardOutput=syslog
    StandardError=syslog

    [Install]
    WantedBy=multi-user.target

    1. Hola Juan,

      en función de la distribución de Linux y la versión que estés usando la activación de un servicio puede variar. Por ejemplo: en Ubuntu.

    • Por HUGO CASAL •

    Hola

    Soy un principiante y no conozco los comandos de linux .Estoy usando un BeagleBone Black ( con debian) para un sistema de telemetría y ya desarrolle varios scripts en python. Todos funcionan bien cuando los ejecuto desde cloud9 , pero ahora quiero que cuando la BBB se encienda o arranque todos los programas se ejecuten de forma automática, Que comandos debería utilizar?.
    Gracias

    1. Hola Hugo,

      se me ocurren dos maneras de que los programas se ejecuten al inicio:

      1. Si utilizas un entorno de escritorio, añadirlos a la lista de aplicaciones que se ejecutan al inicio . En Debian normalmente xdg, configurable en /etc/xdg/autostart
      2. Crear un servicio o demonio para cada aplicación que quieras iniciar. Esta es la manera que se explica en este tutorial.
    • Por Margoth •

    Hola buenas noches muy buena explicación, yo soy principiante en esto y quisiera saber si es posible enviar parámetros al iniciar el .service para poder pasarlos a mi script o programa.
    Gracias por tu ayuda.

    1. Hola Margoth,

      sí, es posible. Lo puedes hacer en el momento de llamar al script con la línea:

      ExecStart=/ruta/hasta/el/script

      En función del lenguaje en el que hayas programado el script lo harás de una manera u otro, pero sería algo así:

      ExecStart=/ruta/hasta/el/script parametro1 parametro2
  1. Saludos,
    Suele suceder que hay procesos como usando el API Streeming de twitter que los procesos se reinician repetitivamente muy rápido originando un error de limite de reinicio,

    Una buena práctica que recomiendo es agregar estas dos lineas de código antes del comando [Install]:

    StartLimitBurst=100
    StartLimitInterval=3

    1. Hola Roque,

      ¡muchas gracias por el apunte!

    • Por Ismael •

    Hola,
    Espero que después de tanto tiempo, me puedas ayudar

    En mi caso quiero que el demonio lance un jar, puedo lanzarlo directamente o por el contrario tengo que crear un sh que ejecute java app.jar

    Muchas gracias
    Un saludo

    • Por Ayudaaaaaaaaaa para Dulce •

    Hola, vi tu tutorial antes que nada muy bueno y muchas felicidades por ser una noble alma que ayuda a la comunidad Linux , Me gustaría saber si me puedes ayudar a estructurar un demonio que pueda validar que un firewall se encuentra apagado y posteriormente encenderlo con solo esa condición.

    Te lo agradecería infinitamente

Dejar un comentario

*
*

 

2 trackbacks