Lire les journaux d'un processus pendant l'exécution d'une commande

10

J'ai un service qui produit des journaux dans le fichier logs.log.

J'ai une autre commande qui interagit avec ce service. Disons que c'est un peu foo.sh.

Ce dont j'ai besoin, c'est de couper et d'enregistrer les journaux logs.logexactement pendant l' foo.shexécution. En d'autres termes, j'ai besoin de cette partie des journaux du service quand il interagit avec mes foo.sh(donc je ne me soucie pas foo.shdes journaux de).

Je m'attends à ce que cette commande fasse l'affaire, mais elle continue de lire le fichier une fois qu'il foo.sha déjà terminé:

> foo.sh | tail -f logs.log > foo_part.log

Y a-t-il une bonne façon d'effectuer cette astuce?

Andremoniy
la source

Réponses:

12

Ceci est rendu assez simple en envoyant vos processus d'arrière-plan à, bien, l'arrière-plan:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!capture le PID du dernier travail envoyé pour s'exécuter en arrière-plan, afin que nous puissions waitterminer votre script, puis killle tailprocessus lorsque nous n'en avons plus besoin.

DopeGhoti
la source
3
réponse impressionnante, a appris quelque chose de nouveau aujourd'hui
Miguel Mota
7

Cette version peut le faire aussi (je pense):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

Notez que% 1 atteindra le premier processus d'arrière-plan dans le sous-shell

Luciano Andress Martini
la source
Personnellement, je préfère capturer des PID explicites plutôt que d'utiliser la liste des travaux, car une mise en œuvre de plus en plus complexe de cela pourrait mettre plus d'une tâche en arrière-plan et kill %1peut atteindre la mauvaise cible.
DopeGhoti
1
Parce que j'ai utilisé les parenthèses du sous-shell, donc% 1 fera référence au premier travail à l'intérieur du sous-shell (mais je n'en suis pas si sûr pour tous les shells). Évidemment, votre solution est plus complète et fonctionnelle pour plus de cas, mais je pense qu'elle peut faire ce dont l'utilisateur a besoin .... Un autre problème est que ma version nécessite au moins la création de foo_part.log avec touch, votre version non.
Luciano Andress Martini