Führen Sie gleichzeitige Instanzen eines Befehls in einem Shell-Skript aus

Führen Sie gleichzeitige Instanzen eines Befehls in einem Shell-Skript aus

Lassen Sie mich zunächst sagen, dass ich Bash-Skripting noch lerne und mir viele Dinge nicht bewusst sind. Wenn ich etwas übersehe, können Sie mich gerne nach Belieben schelten.

Als nächstes erstelle ich ein einfaches Bash-Skript, um einen Ping an zwei verschiedene Hosts auszuführen und in eine Datei auszugeben. Das habe ich bereits abgedeckt und es funktioniert. Aus Neugier habe ich dem Skript hinzugefügt, das Datum nach und vor dem Ping-Ausgabedruck auszugeben, damit ich weiß, wie lange das Ausführen des Pings gedauert hat. Ich habe den Ping auf ein Intervall von 1 Sekunde, 10 Pings und 2 Hosts eingestellt. Mein erstes Datum (war vor langer Zeit...) hatte 14:36:20 als Stundenstempel. Das zweite Datum (nach dem Ping) hatte 14:36:40 als Stundenstempel.

Das Date wartete also, bis beide Pings beendet waren. Das bedeutet, dass die Pings nacheinander ausgeführt wurden.

Kann ich sie gleichzeitig ausführen lassen, sodass ich für die Ausführung des Skripts 10 statt 20 Sekunden brauche?

Hier ist der Ausschnitt meines Skripts:

date >> teste.txt
cat hosts.txt |  while read output
do   ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt

Dieses Skript soll noch einige andere Dinge erledigen, aber ich verspreche, dass ich nur fragen werde, wenn ich auf Barsa keine zufriedenstellende Antwort finde.

PS: In hosts.txt speichere ich die Hosts, die ich anpingen möchte.

Antwort1

Der Wortlaut Ihrer Frage ist ein wenig schwer zu verstehen, aber ich glaube, Sie suchen nach etwas wie:

command & 
command &
wait

Das Skript führt die beiden Befehle im Hintergrund aus und wartet auf die Antwort.

In Ihrem Fall müssen Sie jedoch auf einen Race Condition achten. Sie möchten die Ausgabe der einzelnen Befehle wahrscheinlich in temporäre Dateien senden und sie dann in die Hauptdatei caten, also würden Sie wahrscheinlich etwas wie Folgendes tun:

command > "${tmp1}" & 
command > "${tmp2}" & 
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"

Update: Sie könnten xargs versuchen (zBhttps://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneously)

Antwort2

Mit GNU Parallel können Sie Folgendes tun:

date >> teste.txt
cat hosts.txt |  parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt

verwandte Informationen