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 exec
und zusätzlichenDateideskriptor-Wrangling, Ihr zweiter Vorschlag ist der einfachste. Bevor Sie beginnenX, echo
eine 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