J'exécute actuellement un programme de console de serveur dans un écran parce que je dois à la fois le lire et parfois envoyer des commandes.
Je voudrais exécuter l'application en tant que démon en arrière-plan (démarrer / arrêter avec init).
Je pourrais tail -f
le journal, mais cela ne me laissera pas envoyer d'entrée au processus.
Existe-t-il un moyen de configurer cela afin que je puisse à la fois lire et envoyer des entrées, mais que je puisse toujours les exécuter en arrière-plan?
J'aimerais également pouvoir envoyer des entrées au démon à partir de différents processus (un script shell qui pourrait envoyer une commande "Stop \ n", par exemple).
scripting
shell-script
tail
Bill K
la source
la source
Réponses:
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).
Et écrivez simplement des commandes dans le tuyau:
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.Avec certaines
tail
implémentations, vous pouvez être mordu par mise en mémoire tampon: letail
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, letail
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
letail
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
É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 lalogfile
directive.la source
stuff
commande de l'écran ). Mais vous n'avez pas besoin des frais généraux (traitement, mais surtout cognitifs) d'un terminal ici, un canal est presque suffisant (c'est suffisant avec un petit processus de relais ignorant la fin de fichier). Vous voudrez peut-être expérimenter un peu avec<fifo cat
ou<fifo tail -f | cat
dans un terminal etecho >fifo; echo >fifo
dans un autre terminal; Je pense que tout ira bien.