Lesen Sie die Protokolle eines Prozesses während der Ausführung eines Befehls

10

Ich habe einen Dienst, der Protokolle in der Datei erstellt logs.log.

Ich habe einen anderen Befehl, der mit diesem Dienst interagiert. Nehmen wir an, es sind einige foo.sh.

Was ich brauche, ist das Schneiden und Speichern von Protokollen logs.loggenau während des foo.shLaufens. Mit anderen Worten, ich benötige diesen Teil der Dienstprotokolle, wenn er mit meinen interagiert foo.sh(daher interessieren mich die foo.shProtokolle nicht).

Ich würde erwarten, dass dieser Befehl den Trick macht, aber er liest die Datei weiter, wenn er foo.shbereits fertig ist:

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

Gibt es eine gute Möglichkeit, diesen Trick auszuführen?

Andremoniy
quelle

Antworten:

12

Dies wird ziemlich einfach gemacht, indem Sie Ihre Hintergrundprozesse an den Hintergrund senden:

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

$!Erfasst die PID des letzten Auftrags, der zur Ausführung im Hintergrund gesendet wurde, damit wir waitIhr Skript beenden können, und dann killden tailVorgang, wenn wir ihn nicht mehr benötigen.

DopeGhoti
quelle
3
tolle Antwort, habe heute etwas Neues gelernt
Miguel Mota
7

Diese Version kann es auch (glaube ich):

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

Beachten Sie, dass% 1 den ersten Hintergrundprozess in der Subshell trifft

Luciano Andress Martini
quelle
Persönlich ziehe ich es vor, explizite PIDs zu erfassen, anstatt die Jobliste zu verwenden, da eine immer komplexer werdende Implementierung möglicherweise mehr als eine Aufgabe in den Hintergrund stellt und kill %1möglicherweise das falsche Ziel erreicht.
DopeGhoti
1
Da ich die Subshell-Klammern verwendet habe, bezieht sich% 1 auf den ersten Job innerhalb der Subshell (aber ich bin mir nicht für alle Shells so sicher). Natürlich ist Ihre Lösung für mehr Fälle vollständiger und funktionaler, aber ich denke, sie kann das tun, was der Benutzer benötigt. Ein weiteres Problem ist, dass meine Version mindestens die Erstellung von foo_part.log mit Berührung benötigt, Ihre Version jedoch nicht.
Luciano Andress Martini