Ich habe Tausende von Remote-Rechnern. Ich möchte auf allen bestimmte Befehle ausführen, aber parallel. Ich verwende diese Befehle, die nacheinander ausgeführt werden:
for f in `cat host.lst`
do
./runScript.sh $f
done
Nehmen wir an, es gibt 100 Hosts. Ich möchte auf 100 Hosts parallel host.lst
laufen . Außerdem sollten Protokolle geführt werden.runScript.sh
Ich kann auf meinem Computer kein Dienstprogramm wie installieren PSSH
.
Ich habe viel recherchiert und diese Links gefunden, aber sie haben mir nicht geholfen. Ich verstehe nicht, wie sie funktionieren:
Automatisches Ausführen von Befehlen über SSH auf vielen Servern
Führen Sie den Befehl parallel für mehrere Dateien aus, die einem Muster entsprechen
Kann jemand die Logik erklären?
Antwort1
logdir=`mktemp -d`
bunch=200
IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
IFS=" ";
for host in $hosts; do
ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
done
wait
done
Angenommen, Tausende (Tausende) von Hosts sind in der Datei einzeln aufgelistet hosts.lst
und dann werden aus diesen auf einmal eine Menge (200) ausgewählt. Auf jedem dieser 200 Hosts werden Ihre in runScript.sh
verwendeten Hosts erzeugt und gleichzeitig die von jedem dieser Hintergrundjobs ausgegebenen Daten in einer Datei mit dem Namen im Verzeichnis gespeichert , die bei Bedarf untersucht werden kann.ssh
batch mode
stdout+stderr
host
$logdir
Schließlich warten wir, bis eine Gruppe vorbei ist, bevor wir mithilfe des wait
Befehls am Ende der inneren for
Schleife die nächste Gruppe starten.
Antwort2
Die folgende Änderung an Ihrem Skript, für die keine weiteren Dienstprogramme erforderlich sind, wird parallel ausgeführt, stößt jedoch möglicherweise an Grenzen, je nach den Beschränkungen Ihres Hosts hinsichtlich offener Dateihandles:
for f in $(cat host.lst); do
./runScript.sh $f &
done
Um die Ergebnisse in einem Protokoll festzuhalten, fügen Sie einfach „ > run.log
nach“ hinzu done
, um sie in einer neuen Datei zu speichern run.log
.
Die wichtigste Änderung ist die Hinzufügung von &
, wodurch ein Prozess im Hintergrund ausgeführt wird, anstatt auf dessen Abschluss zu warten, bevor der nächste Befehl ausgeführt wird.