Führen Sie den Befehl mithilfe eines Shell-Skripts parallel auf mehreren Servern aus

Führen Sie den Befehl mithilfe eines Shell-Skripts parallel auf mehreren Servern aus

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.lstlaufen . 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.lstund dann werden aus diesen auf einmal eine Menge (200) ausgewählt. Auf jedem dieser 200 Hosts werden Ihre in runScript.shverwendeten 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.sshbatch modestdout+stderrhost$logdir

Schließlich warten wir, bis eine Gruppe vorbei ist, bevor wir mithilfe des waitBefehls am Ende der inneren forSchleife 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.lognach“ 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.

verwandte Informationen