Lire à partir d'un tuyau, écrire dans un fichier
Si vous voulez que le démon lise les entrées produites par un processus arbitraire, vous devez connecter ce processus à un canal. Ici, le processus arbitraire consiste à faire écho à des commandes, et cela va s'exécuter dans un contexte différent. Créez donc un canal nommé (souvent appelé fifo dans les contextes unix).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
Et écrivez simplement des commandes dans le tuyau:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Cependant, il est peu probable que cela fonctionne: il y a de fortes chances que le démon se termine lorsqu'il voit une fin de fichier sur son entrée standard, ce qui se produit dès la fin du premier processus d'écriture dans le canal. Vous pouvez utiliser tail -f
pour éviter ce problème.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
Avec certaines tail
implémentations, vous pouvez être mordu par mise en mémoire tampon: le tail
processus attendra jusqu'à ce qu'il ait amassé suffisamment d'octets pour émettre une sortie. Je ne pense pas que ce soit résoluble dans la boîte à outils POSIX; si c'est un problème, utilisez un programme trivial C ou Perl ou Python. Pour autant que je sache, le tail
GNU coreutils (que l'on trouve sur Linux et ailleurs) est sûr à cet égard.
Lorsque vous arrêtez le démon, echo >/var/run/daemon.fifo
le tail
processus sera arrêté .
Démarrage du programme à l'intérieur de l'écran
Au lieu d'invoquer le démon directement à partir de votre gestionnaire de services (utilisez-vous vraiment juste SysV init, ou quelque chose de plus comme des scripts wrapper ou Upstart?), Invoquez
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Étant donné que le démon ne sera pas un processus enfant du gestionnaire de services, vous devez vous assurer d'envoyer un signal au bon processus. Comment faire cela dépend exactement de la façon dont le démon est démarré et par quoi.
Il est techniquement possible d'attacher un processus en cours d'exécution à un terminal, mais il y a un risque que vous plantiez le programme, c'est donc définitivement un système de production.
L' -L
option permet à l'écran d'écrire tout ce qui apparaît dans sa fenêtre dans un fichier. Le nom du fichier est donné daemon.screenrc
avec la logfile
directive.