Starten von Programmen auf meheren Rechnern

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Starten von Programmen auf meheren Rechnern

Beitrag von chr.gogolin » 31.03.2008 13:43:15

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!
"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

Benutzeravatar
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

Beitrag von devilx » 01.04.2008 10:28:38

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 :)
When you fart, you stand alone :(
... a place full of dorkness

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Starten von Programmen auf meheren Rechnern

Beitrag von roli » 01.04.2008 11:58:30

devilx hat geschrieben:Da du SSH per Script kein Passwort uebergeben kannst wirst du wohl auf Key-Authentifizierung umstellen muessen.
oder du nutzt "expect", dann kannst du auch das Passwort übergeben.

chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Starten von Programmen auf meheren Rechnern

Beitrag von chr.gogolin » 01.04.2008 20:07:57

Danke für die Antworten.

Key-Authentifizierung hatte ich sowieso schon eingerichtet 8)

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
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]
"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

Antworten