Ich versuche, einige Informationen vor jeder Zeile Ausgabe aus einer Datei hinzufügen, von:Proxy stdout/stderr zu halten, um in bash
- sowohl stdout und stderr fing
- vorangestellte Informationen
Hier ist mein Testskript auf den ursprünglichen Griff ausgibt:
#!/bin/bash
#
# Test proxying stdout and stderr
#
function proxy-stdouterr() {
local name="$1"
local handle=$2
while IFS='' read -r line
do
echo -e "[ ${name}: ${line} ]" >&${handle}
done
}
# Output some messages and attempt to parse them
(
echo "1: Normal message"
echo "2: Error" >&2
echo "3: Normal message"
echo "4: Error" >&2
) 2> >(proxy-stdouterr "stderr" 2) > >(proxy-stdouterr "stdout" 1)
Das funktioniert ziemlich gut, behält aber die Reihenfolge im Terminal nicht bei (Ubuntu 12.04).
Wenn nicht Proxying Ausgänge:
1: Normal message
2: Error
3: Normal message
4: Error
jedoch, wenn Proxying die Reihenfolge nicht eingehalten wird. Schlimmer noch ist dies nicht deterministisch, es die meiste Zeit ist:
[ stderr: 2: Error ]
[ stderr: 4: Error ]
[ stdout: 1: Normal message ]
[ stdout: 3: Normal message ]
Aber gelegentlich:
[ stderr: 2: Error ]
[ stdout: 1: Normal message ]
[ stderr: 4: Error ]
[ stdout: 3: Normal message ]
Wie kann ich dieses Problem beheben?
Dank
Ich denke, dies ist ein grundlegendes Synchronisationsproblem: Wenn Sie Produzenten parallel zu einer freigegebenen Ressource schreiben müssen, können Sie nicht die Reihenfolge garantieren, in der diese Schreibvorgänge ohne irgendeine Form der Koordination stattfinden. – larsks
Auch +1 für ein Beispiel, das die Frage eindeutig zeigt! – larsks
larsks ist korrekt. Die Ausgabe wird in zwei separate IO-Streams aufgeteilt: STDOUT und STDERR (die "Producer"), die dann "proxied", vorangestellt und dann zur Konsole zurückgemeldet werden. Die Zeit für die Verarbeitung jedes Streams kann variieren, insbesondere wenn eine Bash-Funktion als Teil des Streams verwendet wird. Daher ist es nicht möglich, ihre Ausgabe zu synchronisieren (ohne irgendeine Art von Signal zu verwenden). – aks