Leer desde una tubería, escribir en un archivo
Si desea que el daemon lea la entrada producida por algún proceso arbitrario, debe conectar ese proceso a una tubería. Aquí el proceso arbitrario es hacer eco de comandos, y se ejecutará en un contexto diferente. Por lo tanto, cree una tubería con nombre (a menudo llamada fifo en contextos unix).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
Y solo escribe comandos en la tubería:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Sin embargo, es poco probable que funcione como tal: hay una buena posibilidad de que el demonio salga cuando vea un final de archivo en su entrada estándar, lo que ocurre tan pronto como finaliza el primer proceso que escribe en la tubería. Puedes usar tail -f
para evitar ese problema.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
Con algunas tail
implementaciones, puede ser mordido mediante almacenamiento en búfer: el tail
proceso esperará hasta que haya acumulado suficientes bytes para emitir algo de salida. No creo que esto sea solucionable en la caja de herramientas POSIX; Si eso es un problema, utilice un programa trivial C o Perl o Python. Por lo que puedo decir, tail
GNU coreutils (como se encuentra en Linux y en otros lugares) es seguro a este respecto.
Cuando detengas al demonio, echo >/var/run/daemon.fifo
matará el tail
proceso.
Inicio del programa dentro de la pantalla
En lugar de invocar el demonio directamente desde su administrador de servicio (¿realmente está usando solo SysV init, o algo adicional como scripts de envoltura o Upstart?), Invoque
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Dado que el demonio no será un proceso secundario del administrador de servicios, debe asegurarse de enviar una señal al proceso correcto. Cómo hacerlo depende exactamente de cómo se inicia el demonio y por qué.
Es técnicamente posible adjuntar un proceso en ejecución a una terminal, pero existe el riesgo de que bloquee el programa, por lo que definitivamente está fuera de servicio para un sistema de producción.
La -L
opción hace que la pantalla escriba todo lo que aparece en su ventana en un archivo. El nombre del archivo se proporciona daemon.screenrc
con la logfile
directiva.