Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11464[/thread]

per ssh programm im Hintergrund starten

Leser: 2


<< >> 5 Einträge, 1 Seite
knoxo
 2008-03-14 00:38
#107017 #107017
User since
2008-03-13
3 Artikel
BenutzerIn
[default_avatar]
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äß:
Code (perl): (dl )
1
2
3
4
#!/usr/bin/perl -w
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
Code (perl): (dl )
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:
Code: (dl )
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
Code: (dl )
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
Code: (dl )
ps $PID
, 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.
knoxo
 2008-03-14 12:16
#107036 #107036
User since
2008-03-13
3 Artikel
BenutzerIn
[default_avatar]
habe das Posting nochmal etwas überarbeitet. Danke fürs Lesen.
knoxo
Taulmarill
 2008-03-14 12:37
#107037 #107037
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Du könntest auf dem Zielrechner ein Perlscript ablegen, welches sich per fork von der shell löst und dann das eigentlich gewünschte Programm startet.

Das mit dem forken geht, wenn ich mich recht erinnere etwa so:
Code: (dl )
1
2
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2008-03-14 13:02
#107042 #107042
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Ich habe unter http://www.clapper.org/software/daemonize/ noch das Programm daemonize gefunden. So was scheint aber unter Unix/Linux nicht zum Standart zu gehören, ich konnte es zumindest weder auf Solaris 8 noch auf Debian finden.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
knoxo
 2008-03-14 16:35
#107061 #107061
User since
2008-03-13
3 Artikel
BenutzerIn
[default_avatar]
Danke. Habe daemonize soeben erfolgreich auf nem OpenSuSE compiliert... Gucke ich mir mal an.
<< >> 5 Einträge, 1 Seite



View all threads created 2008-03-14 00:38.