Hallo,
für die Uni möchte ich einige Simulationen in dem Computerraum unseres Instituts laufen lassen. Die Rechner sind per ssh erreichbar und haben den ip-Adressen-Bereich x.x.x.1 - x.x.x.40.
Eine Liste mit allen nötigen Programmaufrufen ist schnell zusammengestellt.
Was ich jetzt noch brauche, ist ein kleines Shell-Skript, dass zunächst auf jedem der 40 Rechner einen der Aufrufe aus der Liste ausführt und sobald der Rechner fertig ist die restlichen Aufrufe der Reihe nach "nachschiebt", bis alle abgearbeitet sind. Dabei muss und soll nicht darauf gewartet werden bis alle 40 Rechner mit ihrem Auftrag fertig sind sondern jeder soll gleich wieder beschäftigt werden.
Gibt es da was fertiges und wenn nein, wie würde man sowas realisieren?
Danke!
Starten von Programmen auf meheren Rechnern
-
- Beiträge: 441
- Registriert: 12.10.2005 23:09:28
- Lizenz eigener Beiträge: MIT Lizenz
-
Kontaktdaten:
Starten von Programmen auf meheren Rechnern
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett
- devilx
- Beiträge: 734
- Registriert: 26.08.2003 22:57:20
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Filderstadt
-
Kontaktdaten:
Re: Starten von Programmen auf meheren Rechnern
Da du SSH per Script kein Passwort uebergeben kannst wirst du wohl auf Key-Authentifizierung umstellen muessen. Dabei kennen sich die einzelnen Rechner, bzw. die Server auf denen die Kommandos ausgefuehrt werden sollen kennen den Client auf dem das Script laeuft und dessen Key. Anschliessend kannst du hergehen und ein simples Bash-Script schreiben welches in einer schleife auf jeden Server verbindet und ein Kommando ausfuehrt.
When you smile, the world smiles with you ![Smile :)](./images/smilies/icon_smile.gif)
When you fart, you stand alone![traurig :(](./images/smilies/icon_sad.gif)
... a place full of dorkness
![Smile :)](./images/smilies/icon_smile.gif)
When you fart, you stand alone
![traurig :(](./images/smilies/icon_sad.gif)
... a place full of dorkness
Re: Starten von Programmen auf meheren Rechnern
oder du nutzt "expect", dann kannst du auch das Passwort übergeben.devilx hat geschrieben:Da du SSH per Script kein Passwort uebergeben kannst wirst du wohl auf Key-Authentifizierung umstellen muessen.
-
- Beiträge: 441
- Registriert: 12.10.2005 23:09:28
- Lizenz eigener Beiträge: MIT Lizenz
-
Kontaktdaten:
Re: Starten von Programmen auf meheren Rechnern
Danke für die Antworten.
Key-Authentifizierung hatte ich sowieso schon eingerichtet
So ganz so simpel ist dass aber leider nicht. Meine Skript funktioniert zwar aber etwas stört mich.
Mein Skript funktioniert im Prinzip so. Es wird eine Liste mit auszuführenden Programmaufrufen erstellt und in einen Array (CommandArray)
abgelegt und eine Liste mit den ips von in im Netz erreichbaren Rechnern ermittelt ($ipList). Letzteres mache ich mit "nmap".
Die eigentliche Verwaltung der Jobs mache ich dann über eine Schleife mit der eine Subshell für jede ssh-Verbindung gestartet wird.
Die einzelnen Subshells müssen nun aber wissen welche Jobs schon bearbeitet wurden/werde. Dazu müsste man eine Variable haben auf die alle Subshells lesend und schreibend zugreigen können. Das habe ich aber nicht hinbekommen. Selbst mit "export" bekommt man den Wert der Variable nicht wieder aus der Subshell heraus bevor diese beendet ist. Also nehme ich eine Datei um die Nummer des nächsten zu bearbeitenden Jobs zu speichern.
Das ist leider nicht nur unelegant, sondern kann auch zu Problemen führen. Wenn zwei Prozesse zugleich auf die Datei lesend und schreibend zugreifen wollen, kann es passieren dass ich mit "read" keine Zahl, sondern wildes Buchstaben-Gewürche in die variable "$JOBSTOBERUN" schreibt, was dann natürlich zum Absturz führt.
Kann man das besser lösen?
[edit]Da die letzte Frage von mir wohl etwas off topic war habe ich dazu einen neuen Thread (http://www.debianforum.de/forum/viewtop ... 34&t=97886) aufgemacht.[/edit]
Key-Authentifizierung hatte ich sowieso schon eingerichtet
![Cool 8)](./images/smilies/icon_cool.gif)
So ganz so simpel ist dass aber leider nicht. Meine Skript funktioniert zwar aber etwas stört mich.
Mein Skript funktioniert im Prinzip so. Es wird eine Liste mit auszuführenden Programmaufrufen erstellt und in einen Array (CommandArray)
abgelegt und eine Liste mit den ips von in im Netz erreichbaren Rechnern ermittelt ($ipList). Letzteres mache ich mit "nmap".
Die eigentliche Verwaltung der Jobs mache ich dann über eine Schleife mit der eine Subshell für jede ssh-Verbindung gestartet wird.
Die einzelnen Subshells müssen nun aber wissen welche Jobs schon bearbeitet wurden/werde. Dazu müsste man eine Variable haben auf die alle Subshells lesend und schreibend zugreigen können. Das habe ich aber nicht hinbekommen. Selbst mit "export" bekommt man den Wert der Variable nicht wieder aus der Subshell heraus bevor diese beendet ist. Also nehme ich eine Datei um die Nummer des nächsten zu bearbeitenden Jobs zu speichern.
Code: Alles auswählen
for ip in $ipList
do
(
read < ./jobstoberun JOBSTOBERUN
while [ 1 ] ; do
read < ./jobstoberun JOBSTOBERUN
if [ "$JOBSTOBERUN" -le 0 ]
then
echo "[$JOBSTOBERUN]@$ip: no jobs left"
break
fi
echo $(($JOBSTOBERUN-1)) > ./jobstoberun
echo "[$JOBSTOBERUN]@$ip: ssh -l cgogolin $ip ${CommandArray[$JOBSTOBERUN]}"
ssh -l cgogolin $ip ${CommandArray[$JOBSTOBERUN]}
if [ "$?" != "0" ]; then
echo "[$JOBSTOBERUN]@$ip: job failed or aborted"
echo "${CommandArray[$JOBSTOBERUN]}" >> ./failedjobs.log
break
else
echo "[$JOBSTOBERUN]@$ip: finished"
fi
done
)&
sleep 1
done
wait
Kann man das besser lösen?
[edit]Da die letzte Frage von mir wohl etwas off topic war habe ich dazu einen neuen Thread (http://www.debianforum.de/forum/viewtop ... 34&t=97886) aufgemacht.[/edit]
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett