Standardausgabe eines Befehls für t Sekunden verwerfen

Standardausgabe eines Befehls für t Sekunden verwerfen

Ich arbeite an einigen Batch-Skripten mit folgendem Inhalt:

  • Führen Sie einige nicht terminierende Unterprozesse (asynchron) aus.
  • Warten aufTSekunden
  • Andere Aufgabe ausführenXfür einige Zeit
  • Unterprozesse beenden

Idealerweise möchte ich in der Lage sein, den Standardout der ausgegebenen Unterprozesse zu unterscheidenVor Xvon dem, was emittiert wurdenach X.

Mir fallen da ein paar Ideen ein, ich habe aber noch keine Ahnung, wie ich sie umsetzen würde:

  • Verwerfen Sie stdout fürTSekunden
  • Fügen Sie Text ein (z. B. „Aufgabe X gestartet“), um die Abschnitte optisch voneinander zu trennen.
  • Aufteilen von stdout in verschiedene Ausgabeströme

Antwort1

Man könnte die Sache zwar verkomplizieren mit execund zusätzlichenDateideskriptor-Wrangling, Ihr zweiter Vorschlag ist der einfachste. Bevor Sie beginnenX, echoeine Markierungszeichenfolge in der Protokolldatei.

Alle diese Befehle würden an dieselbe Datei angehängt, daher wäre es vielleicht eine gute Idee, alle Ausgaben vonXmit einem Marker, damit Sie die Ausgabe von der der noch laufenden vorherigen Befehle unterscheiden können. Etwas in der Art:

{ X; } | sed 's,^,[X say] ,'

Dies würde die weitere Analyse wesentlich vereinfachen. Es ist jedoch nicht sicher und bei sehr ausführlichen Programmen würden häufig Race Conditions auftreten.

Wenn Sie bereit sind, das Risiko einzugehen, eine Protokollzeile zu unterbrechen, und die erste Reihe von Apps ohne Konsequenzen unterbrechen können, würde auch dies funktionieren:

{ Y; } >> log &
sleep $t
kill -STOP %% # last job, like the same as %1
echo -e "\nX started" >> log
kill -CONT %%
{ X; } >> log2

verwandte Informationen