Wie führe ich Skripte parallel auf einem entfernten Rechner aus?


16

Ich kann in eine entfernte Maschine ssh, die 64 Kerne hat. Nehmen wir an, ich muss auf diesem Computer 640 Shell-Skripte parallel ausführen. Wie mache ich das?

Ich kann sehen, die 640 Skripte in 64 Gruppen von jeweils 10 Skripten aufzuteilen. Wie würde ich dann jede dieser Gruppen parallel betreiben , dh eine Gruppe auf jedem der verfügbaren Kerne.

Wäre ein Skript des Formulars

    ./script_A &
    ./script_B &
    ./script_C &
    ...

wo script_Aentspricht die erste gruppe, script_Bdie zweite gruppe etc. ausreichen?

Die Skripte in einer Gruppe, die auf einem Kern ausgeführt werden, können auch nacheinander ausgeführt werden, aber ich möchte, dass die Gruppen auf allen Kernen parallel ausgeführt werden.


Es ist nicht garantiert, dass sie gleichmäßig von den Kernen verteilt werden. Schauen Sie sich diesen Thread an. stackoverflow.com/questions/13583146/…
Rui F Ribeiro

Antworten:


24

Das sieht nach einem Job für gnu parallel aus:

parallel bash -c ::: script_*

Der Vorteil ist, dass Sie Ihre Skripte nicht nach Kernen gruppieren müssen, sondern paralleldies für Sie tun.

Wenn Sie die SSH-Sitzung nicht überwachen möchten, während die Skripts ausgeführt werden, sollten Sie natürlich nohupoder verwendenscreen


Es ist eine gute Antwort, und ich akzeptiere sie, da dies im Allgemeinen gut funktionieren würde. Leider habe ich persönlich keine Administratorrechte für den Remotecomputer und kann das parallelPaket daher nicht installieren . Thanks`
Tom

10
Sie müssen nicht parallel global installieren: Sie sollten in der Lage sein, eine Kopie von Ihrem eigenen Ausgangsverzeichnis aus auszuführen.
Dhag

bash -ckann nicht benötigt: parallel ::: ./script*. Mit 640-Skript ist es wahrscheinlich, dass sie sehr ähnlich sind (z. B. nur ein Argument ist anders). Verwenden Sie GNU Parallel direkt, um diese Argumente zu setzen und ein einzelnes Skript zu verwenden.
Ole Tange

Wie würde ich gnu parallel auf einem entfernten Rechner installieren?
Tom

@Tom Was ändert sich durch die Tatsache, dass Sie einen Remote-Computer verwenden? Holen Sie sich einfach das richtige Paket von gnu.org/software/parallel und installieren Sie es.
Dmitry Grigoryev

5

Das funktioniert, solange Sie die Ausgabe nicht überwachen müssen und Ihre ssh-Sitzung so lange geöffnet bleibt, wie die Skripte ausgeführt werden. Wenn eine dieser Aussagen nicht zutrifft, würde ich die Verwendung screenmehrerer Registerkarten empfehlen . Sie könnten so etwas tun

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

Überwachen der Ausgaben, um die es mir nicht geht - ich möchte die ssh-Sitzung nicht offen lassen. Was ist mit nohup? Dies würde verhindern, dass die Skripte angehalten werden, wenn die Sitzung beendet wird. Ich werde mir auch Ihre Bildschirmempfehlung ansehen. Vielen Dank!'
Tom

nohupwürde wahrscheinlich funktionieren, ich bin nur vertrauter mit screenund es hat viel mehr Funktionen, die für Sie nützlich sein können oder auch nicht.
David King

2

Um eine große Anzahl von Skriptaufträgen zu starten und zu verwalten, benötigen Sie eine Verwaltungssoftware, um die Ressourcennutzung (CPU, Speicher, Priorität) zu steuern und den Auftragsstatus (Warten, Anhalten, Ausführen, Beendet) anzuzeigen.

Die Grid-Engine wurde beispielsweise für Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) oder Open Grid Scheduler ( http://gridscheduler.sourceforge.net/ ) entwickelt. Sie benötigen den Administrator, um die richtige Software für Sie zu installieren, bevor Sie beginnen können. Möglicherweise kann der Administrator dies tun, anstatt zu sehen, dass Hunderte von Prozessen auf dem Computer ausgeführt werden und keine Kontrolle über sie haben.

Im Allgemeinen definiert der Administrator, in wie viele Slots eine Maschine unterteilt werden kann. Wenn Sie einen Job an eine Warteschlange übergeben und angeben, wie viele Slots der Job verbrauchen soll, überwacht die Grid-Engine die Gesamtsystemnutzung und führt den Job entsprechend aus die von admin definierte Warteschlangenrichtlinie. Zum Beispiel können nicht mehr als x Jobs gleichzeitig ausgeführt werden. Der Rest der Jobs befindet sich im Wartezustand in der Warteschlange und wird freigegeben, nachdem frühere Jobs beendet wurden.



0

Ich habe das schon mehrmals gemacht und in der Regel nur mein eigenes Skript erstellt, um die Arbeit mit der Jobsteuerung zu erledigen. Im Allgemeinen sieht die Lösung folgendermaßen aus, wenn Sie die Namen aller Skripte haben, die Sie in einer Datei ausführen möchten:

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

Es ist rohe Gewalt, aber effektiv. Außerdem brauchen Sie keine zusätzliche Software, wie sie parallel zu Ihren Systemen hinzugefügt werden kann.

Ein großes Problem ist, dass der Befehl wait auf den Abschluss des langsamsten Skripts wartet, wodurch Zeit verschwendet werden kann. Ich habe Skripte erstellt, um diese Situation zu bewältigen, aber sie werden komplexer, wie Sie sich vorstellen können. Wenn alle Ihre Skripte ungefähr in der gleichen Zeit ausgeführt werden, funktioniert dies gut.

Ein weiteres Problem ist, dass Sie MAX_PROCS möglicherweise optimieren müssen, um die beste Leistung zu ermitteln.

Natürlich kann die Anzahl der SSH-Verbindungen unhandlich werden. Verschieben Sie in diesem Fall dieses Skript einfach auf den Remote-Host und ändern Sie die Zeile "ssh ...", um die Skripts direkt auszuführen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.