Ich plane so eine Art Steuerskript für paralleles numerisches Rechnen im Netzwerk (eine Liste von auszuführenden Rechenaufträgen soll eingelesen und an freie Multiprozessor-Linux-Rechner im Netzwerk verschickt und die Ergebnisse anschließend wieder eingesammelt werden), nur fehlt mir hier leider noch der Überblick, wie ich das am besten anstelle.
Ich fange also erst mal klein an und nutze folgendes kleines Skript, um mich auf einem remote-Rechner einzuloggen, ein Programm auszuführen und die Verbindung dann wieder zu beenden, sinngemäß:
open (SSH, "|/usr/bin/ssh -T sim\@host");
print (SSH "myprog -a parameter\n");
close(SSH);
Da das myprog schon ein Weilchen braucht, bis es fertig ist, will ich mich vorher ausloggen - es also im Hintergrund starten.
Die Variante
print (SSH "nohup myprog -a parameter &\n");
bringt leider keine Punkte... Das Ausloggen erfolgt wieder erst, nachdem myprog fertig ist.
Wenn ich das per Hand an der bash mache, geht z.B. folgender Befehl:
ssh -f sim@host "cd somedirectory; myprog -a parameter"
d.h. ssh loggt sich ein, setzt den Befehl im Hintergrund ab und kehrt zur bash zurück.
Das würde ich nun gerne in perl sinngemäß umsetzen.
Vielleicht kann mir noch jemand zu folgender Sache weiterhelfen:
Ich will ja, wie oben erwähnt, mehrere dieser Programme auf verschiedenen hosts starten, und dabei auf dem lokalen Rechner den Überblick behalten, welche der gestarteten Programme noch laufen und welche schon beendet sind, um dann entsprechend neue Rechenaufträge abzusetzen.
Ich dachte, ich mache das so:
Ich lasse mir mit
ssh sim@host "pgrep -u sim -n myprog"
die PID des zuletzt gestarteten Programms zurückgeben, speichere diese PID lokal in $PID und frage von Zeit zu Zeit nach, ober der Prozess noch läuft mittels sowas wie
, indem ich dessen Ausgabe auswerte
Was ich vermeiden will, ist, den Quellcode von myprog zu ändern oder auf dem host ein weiteres Steuerskript zu starten, was dann Nachrichten über Programmstatus und Fortschritt z.B. per Mail versendet. Das wird sonst alles zu komplex.
Auf ähnliche Weise wie oben will ich einen Programmfortschritt abfragen können:
myprog schreibt in sinnvollen Intervallen seinen Fortschritt (z.B. in Prozent) in eine eindeutig betitelte Datei namens "fortschritt_$PID", die ich dann z.B. per scp auf den lokalen Rechner hole und auslese.
Nun ist die Frage, ob davon einiges auch eleganter umzusetzen ist, und wie man sowas in Perl machen könnte.
Im Skript will ich direkt die Systembefehle nutzen... Module wie Net::SSH::Perl will ich vermeiden.
Wäre wirklich dankbar für jegliche Hilfe, seien es Details oder konzeptionelle Dinge.
knoxo.