Leggi da una pipe, scrivi su un file
Se si desidera che il demone legga l'input prodotto da un processo arbitrario, è necessario connettere tale processo a una pipe. Qui il processo arbitrario sta facendo eco ai comandi e verrà eseguito in un contesto diverso. Quindi crea una pipe con nome (spesso chiamata un quindicesimo in contesti unix).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
E basta scrivere i comandi nella pipe:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
È improbabile che ciò funzioni come è comunque: c'è una buona probabilità che il demone esca quando vede la fine del file sul suo input standard, cosa che accade non appena termina il primo processo che scrive nella pipe. Puoi usarlo tail -f
per evitare quel problema.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
Con alcune tail
implementazioni, potresti essere morso dal buffering: il tail
processo attenderà fino a quando non avrà accumulato abbastanza byte per emettere un output. Non penso che questo sia risolvibile nella casella degli strumenti POSIX; se questo è un problema, usa un banale programma C o Perl o Python. Per quanto ne so, tail
dai coreutils di GNU (come si trova su Linux e altrove) è sicuro su questo punto.
Quando interrompi il demone, echo >/var/run/daemon.fifo
il tail
processo verrà interrotto .
Avvio del programma all'interno della schermata
Invece di invocare il demone direttamente dal tuo gestore servizi (stai davvero usando solo SysV init o qualcosa di aggiuntivo come gli script wrapper o Upstart?), Invoca
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Poiché il daemon non sarà un processo figlio del gestore servizi, è necessario assicurarsi di inviare un segnale al processo corretto. Come farlo dipende esattamente da come viene avviato il demone e da cosa.
È tecnicamente possibile collegare un processo in esecuzione a un terminale, ma c'è il rischio che si blocchi il programma, quindi questo è sicuramente fuori per un sistema di produzione.
L' -L
opzione fa scrivere allo schermo tutto ciò che appare nella sua finestra in un file. Il nome del file viene fornito daemon.screenrc
con la logfile
direttiva.