Comment créer un script shell qui envoie la sortie à un process

J'exécute actuellement un programme de console de server dans un écran parce que j'ai besoin à la fois le lire et parfois envoyer des commands.

Je voudrais exécuter l'application en tant que deamon en arrière-plan (démarrer / arrêter avec init).

Je pourrais utiliser le journal, mais cela ne me permettra pas d'envoyer des commentaires au process.

Y a-t-il un moyen de le configurer pour que je puisse lire et envoyer des données, mais que je le fasse fonctionner en arrière-plan?

Je voudrais aussi pouvoir envoyer des données au deamon à partir de différents process (un script shell qui pourrait envoyer une command "Stop \ n", par exemple)

Lire à partir d'un tuyau, écrire dans un file

Si vous voulez que le démon lise l'input produite par un process arbitraire, vous devez connecter ce process à un canal. Ici, le process arbitraire est l'écho des commands, et il va s'exécuter dans un context différent. Créez donc un tube nommé (souvent appelé fifo dans des contexts unix).

mkfifo /var/run/daemon.fifo </var/run/daemon.fifo /path/to/daemond --option >daemon.log 

Et juste écrire des commands à la pipe:

 echo 'FORWARD 10' >/var/run/daemon.fifo echo 'LEFT 72' >/var/run/daemon.fifo 

Il est peu probable que cela fonctionne: il y a de fortes chances pour que le démon se ferme quand il voit une fin de file sur son input standard, ce qui arrive dès que le premier process d'écriture dans le canal se termine. Vous pouvez utiliser la 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 implémentations de tail , vous pouvez être mordu par la mise en memory tampon: le process de tail attendra jusqu'à ce qu'il ait amassé suffisamment d'octets pour émettre une sortie. Je ne pense pas que cela soit résoluble dans la boîte à outils POSIX; si c'est un problème, utilisez un programme sortingvial C ou Perl ou Python. Autant que je peux dire la tail de GNU coreutils (comme on le trouve sur Linux et ailleurs) est sûr à cet égard.

Lorsque vous arrêtez le démon, echo >/var/run/daemon.fifo va tuer le process de tail .


Démarrage du programme à l'écran

Au lieu d'appeler le démon directement depuis votre gestionnaire de services (utilisez-vous vraiment 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 

Puisque le démon ne sera pas un process enfant du gestionnaire de service, vous devez vous assurer d'envoyer un signal au bon process. Comment faire cela dépend exactement comment le démon est démarré et par quoi.

Il est techniquement possible d'attacher un process en cours à un terminal, mais vous risquez de planter le programme, alors c'est définitivement un système de production.

L'option -L permet à l'écran d'écrire tout ce qui apparaît dans sa window dans un file. Le nom de file est donné dans daemon.screenrc avec la directive logfile .