Zwei gleichzeitige Befehle, dann sequentielle Befehle?

1

Daher möchte ich unter Linux viermal ein Skript ausführen und dann die Ausgabe bearbeiten.

Ich kann:

script 1 > output1.txt
script 2 > output2.txt
script 3 > output3.txt
script 4 > output4.txt
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u 

Aber ich möchte, dass die ersten vier parallel laufen (schneller). Wenn ich sie in den Hintergrund stelle, springt sie in die fünfte Zeile, was bis zum Ende der ersten vier nicht erfolgreich sein wird.

EDIT: Danke für die Antworten. Ich habe einige davon ausprobiert, bin mir aber nicht sicher, ob sie funktionieren werden, da ich (a) 4 verschiedene Skripte gleichzeitig ausführen muss, nicht das gleiche vier Mal, und (b) die Ausgaben jedes Skripts müssen in einer TXT-Datei gespeichert werden (dies ist sehr wichtig). Ich habe das oben Gesagte aktualisiert, um dies widerzuspiegeln.

Die Leute in meinem Büro lieben es, xargs zu benutzen, also wäre das meine Vorliebe (obwohl ich für alles offen bin).

Vielen Dank!

Alex
quelle
1
Hier ist ein Beitrag von SO: stackoverflow.com/questions/10909685/…
Josh
Was Sie brauchen, können Sie mit parallel(beiden Versionen) problemlos erledigen . Hast du es versucht?
Slhck

Antworten:

3

Das eingebaute Wait Bash erledigt den Trick ...

script 1 > output1.txt &
script 2 > output2.txt &
script 3 > output3.txt &
script 4 > output4.txt &
wait
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u 
xae
quelle
HA! Einfach genug, aber alles was ich brauchte. Vielen Dank!
Alex
2

Mit moreutils 'parallel :

parallel -- script-1 script-2
cat out1 out2 out3 out4

Die zweite Zeile wird ausgeführt, sobald alle Jobs beendet parallelwurden. Wenn Ihr Skript Argumente enthält, müssen Sie diese in Anführungszeichen setzen, z

parallel -- 'script-1 argument1' script-2

Dies kann auch mit GNU Parallel gemacht werden, aber ich habe es aufgrund offensichtlicher Namenskonflikte nicht auf meinem System. Ich denke, Sie müssen nur eine Liste von Skripten erstellen und dann:

cat list-of-scripts > parallel -j4
cat out1 out2 out3 out4

Das -j4Mittel parallelwird, wenn möglich, auf 4 Kernen ausgeführt.

slhck
quelle
0

Ich empfehle die Verwendung von GNU parallel. Es ist eine praktische Anleitung für die es hier . Entweder können Sie alle vier Skripte gleichzeitig ausführen und dann den fünften Befehl ausführen, oder Sie können festlegen, dass die Ausgabe von den ersten vier in die vierte umgeleitet und alle fünf parallel ausgeführt werden. Hier ist der Befehl, alle vier gleichzeitig auszuführen:

parallel ::: script-1 script-2 script-3 script-4

Sie können die Ausgabe direkt an den fünften Befehl weiterleiten. Standardmäßig parallelwerden die Ausgaben der einzelnen Befehle gruppiert. Wenn z. B. Skript-2 zuerst ausgeführt wird, beginnt der Ausgabestream mit der gesamten Ausgabe von Skript-2, gefolgt von der des nächsten auszuführenden Befehls. Verwenden --line-bufferSie diese Option, wenn Sie sich nicht für das Mischen von Ausgabezeilen verschiedener Befehle interessieren. Verwenden --keep-orderSie diese Option, wenn Sie die Ausgabe der Befehle in der richtigen Reihenfolge benötigen, dh die Ausgabe von Skript-1, dann Skript-2 usw.

Eine andere Möglichkeit ist, einfach zu verwenden xargs, was bereits auf Ihrem System installiert sein sollte. xargsverfügt über eine -POption, mit der Sie die Anzahl der gleichzeitigen Prozesse angeben können. Beachten Sie, dass die Ausgabe nicht gruppiert werden kann, sodass Sie nicht direkt in den fünften Befehl übergehen können. Normalerweise müssen Sie auch einstellen -n.

wingedsubmariner
quelle