Estoy escribiendo un script de shell que me gustaría ejecutar como demonio en el inicio sin usar herramientas externas como daemontools o daemonize .
COMO de Linux Daemon Writing
De acuerdo con el Linux Daemon Writing HOWTO , un demonio adecuado tiene las siguientes características:
- horquillas 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 sea persistente (generalmente
/
) - restablece la máscara de modo de archivo (umask)
- crea una ID de sesión (SID) única
daemonize Introducción
La Introducción daemonize va más allá, afirmando que un demonio típico también:
- se disocia de su terminal de control (si hay uno) e ignora todas las señales de terminal
- se disocia de su grupo de procesos
- manejas
SIGCLD
¿Cómo voy a hacer todo esto en una sh
, dash
o bash
la escritura con sólo 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 de 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 ofrece algunos consejos, aunque parece haber algunas diferencias entre los SysV
demonios de estilo antiguo y los systemd
más nuevos . Dado que la compatibilidad con una variedad de distribuciones es importante, asegúrese de que la respuesta aclare cualquier diferencia.
fuente
daemon
y esas otras cosas son para ejecutar scripts de shell arbitrarios sin ninguna disposición para ejecutarse como Un demonio. Como usted es el autor y tiene el control total de cómo se escribe ese script, hágalo para que pueda iniciarse desde un archivo systemd unitf o script rc.d. Usted hizo especifica "correcto"!Respuestas:
Con systemd , debería poder ejecutar un script como demonio creando una unidad simple. Puede agregar muchas opciones diferentes , pero esto es lo más simple que puede obtener.
Digamos que tienes un guión
/usr/bin/mydaemon
.Creas una unidad
/etc/systemd/system/mydaemon.service
.Para iniciar el demonio que corres
Para comenzar en el arranque lo habilitas
Si 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.
fuente
systemd
no es más una "herramienta externa" quebash
.Probablemente estoy perdiendo algo aquí; ¿Por qué exactamente no
nohup
sería apropiado? Por supuesto que no es suficiente solo , pero completándola parece sencillo.Por lo que puedo ver:
stdin
sin embargo, muere al final del script principalinit
(osystemd
)Tengo la fuerte sensación de que me falta lo obvio. Voto negativo, pero por favor dime qué es :-)
fuente
nohup
con&
E / S y redirección a lanzar varios no -C
utilidades demonio tal vez con la seguridad añadida de envolver sunohup
interior el mando de unasu -c "nohup ... &" -s /bin/bash systemUser
de ejecutar el demonio como un usuario sin privilegios.El
screen
comando de Linux contenido en la mayoría de las distribuciones puede demonizar un script de shell. Lo uso a menudo Aquí hay un ejemplo rápido para comenzar, enumerar y salir de una sesión de pantalla separada ...fuente
screen
no desamoniza el script de shell. Simplemente los ejecuta en un terminal distinguido y puede desconectarse de este terminal (como desconectar el teclado de la PC) sin cerrar la sesión. Entonces, el programa que se ejecuta en un terminal separado se ejecuta en segundo plano. Por lo tanto, separe el programa de pase en segundo plano.