Ich arbeite an einigen Batch-Skripten, die Folgendes beinhalten:
- Führen Sie einige nicht terminierende Unterprozesse (asynchron) aus
- Warten Sie auf t Sekunden
- Führe andere Aufgabe X aus seit einiger Zeit
- Teilprozesse beenden
Idealerweise möchte ich den stdout der vorher ausgegebenen Teilprozesse unterscheiden können X von dem, was nach emittiert wurde X .
Ein paar Ideen kommen mir in den Sinn, obwohl ich keine Ahnung habe, wie ich sie umsetzen würde:
- Stdout für t verwerfen Sekunden
- Fügen Sie etwas Text ein (z. B. „Aufgabe X gestartet“), um die Abschnitte optisch zu trennen
- Teilen Sie stdout in verschiedene Ausgabeströme auf
Akzeptierte Antwort:
Während Sie die Sache mit exec
verkomplizieren könnten und zusätzliches Dateideskriptor-Wrangling, Ihr zweiter Vorschlag ist der einfachste. Vor dem Start von X , echo
eine Markierungszeichenfolge in die Protokolldatei.
Alle diese Befehle würden an dieselbe Datei angehängt, daher wäre es vielleicht eine gute Idee, der gesamten Ausgabe von X voranzustellen mit einem Marker, damit Sie seine Ausgabe von der eines der noch laufenden vorherigen Befehle unterscheiden können. Etwas in der Art von:
{ X; } | sed 's,^,[X say] ,'
Dies würde die weitere Analyse erheblich vereinfachen. Es ist nicht sicher und bei sehr ausführlichen Programmen treten häufig Race Conditions auf.
Wenn Sie bereit sind, die Chance zu nutzen, eine Protokollzeile zu unterbrechen, und den ersten Stapel von Apps ohne Konsequenzen unterbrechen können, würde dies auch funktionieren:
{ Y; } >> log &
sleep $t
kill -STOP %% # last job, like the same as %1
echo -e "nX started" >> log
kill -CONT %%
{ X; } >> log2