linux – Manera "adecuada" de ejecutar un script de shell como un demonio

Pregunta:

Estoy escribiendo un script de shell que me gustaría ejecutar como demonio al inicio sin usar herramientas externas como daemontools o daemonize .


CÓMO de escritura de demonios de Linux

Según el CÓMO de escritura de demonios de Linux , un demonio adecuado tiene las siguientes características:

  • bifurcaciones del proceso padre
  • cierra todos los descriptores de archivos (es decir, stdin , stdout , stderr )
  • abre registros para escribir (si está configurado)
  • cambia el directorio de trabajo a uno que es persistente (generalmente / )
  • restablece la máscara del modo de archivo (umask)
  • crea una ID de sesión única (SID)

Introducción a daemonize

La Introducción de daemonize va más allá, indicando que un daemon típico también:

  • se disocia de su terminal de control (si hay uno) e ignora todas las señales del terminal
  • se disocia de su grupo de procesos
  • maneja SIGCLD

¿Cómo haría todo esto en un script sh , dash o bash con herramientas comunes de Linux?

El script debería poder ejecutarse en tantas distribuciones como sea posible sin software adicional, aunque Debian es nuestro enfoque principal.


NOTA: Sé que hay muchas respuestas en la red StackExchange que recomiendan el uso de nohup o setsid , pero ninguno de estos métodos aborda todos los requisitos anteriores.


EDITAR: La página de manual de daemon (7) también da algunos consejos, aunque parece haber algunas diferencias entre los demonios SysV estilo antiguo y los más nuevos de systemd . Dado que la compatibilidad con una variedad de distribuciones es importante, asegúrese de que la respuesta aclare cualquier diferencia.


Respuesta:

Con systemd , debería poder ejecutar un script como un demonio creando una unidad simple. Hay muchas opciones diferentes que puede agregar, pero esto es lo más simple que puede obtener.

Digamos que tiene un script /usr/bin/mydaemon .

#!/bin/sh

while true; do
  date;
  sleep 60;
done

No olvide sudo chmod +x /usr/bin/mydaemon .

Crea una unidad /etc/systemd/system/mydaemon.service .

[Unit]
Description=My daemon

[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure

[Install]
WantedBy=multi-user.target 

Para iniciar el demonio, corres

systemctl start mydaemon.service 

Para comenzar en el arranque, lo habilita

systemctl enable mydaemon.service

Si está en un sistema basado en systemd, que es la mayoría de las distribuciones de Linux en la actualidad, esta no es realmente una herramienta externa. Sin embargo, lo negativo sería que no funcionará en todas partes.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım