Mein Perl-Programm soll auf einem anderen Rechner einen Befehl ausführen, der allerdings mehrere Minuten dauert. Dazu benutze ich Net::SSH::Perl.
Mein Programm stoppt hier aber und wartet auf die Beendigung des Befehls. Wie kann ich einen Befehl im Hintergrund ausführen?
my $host = "hostname";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login();
my($out, $err, $exit) = $ssh->cmd("./directory/shellscript.sh");
User since
2005-01-17
14747
Artikel
Admin1
Indem du dein Skript im Hintergrund laufen lässt mit dem Parameter &.
Beispiel:
meinsshcmd &
falls du es so gemeint hast:
my($out, $err, $exit) = $ssh->cmd("./directory/shellscript.sh &");
dann geht es leider nicht. es wird trotzdem auf den return-wert des scripts gewartet.
User since
2005-01-17
14747
Artikel
Admin1
Nein, dein lokales Skript!
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
STDIN und STDERR sind immer noch mit dem virt. Terminal verbunden.
Das könnte funktionieren:
my($out, $err, $exit) = $ssh->cmd("./directory/shellscript.sh >/dev/null 2>&1 &");
@gwendragon: mein lokales script ist ein interaktives script mit gui usw. das im hintergrund laufen zu lassen hilft mir dann nicht wirklich weiter.
@ dubu: werd ich gleich mal testen. thx :)
>/dev/null 2>&1
was passiert hier eigentich genau ?
User since
2005-08-17
1420
Artikel
BenutzerIn
STDOUT und STDERR werden nach /dev/null umgeleitet.
Eventuell könnte man vor
./directory/shellscript.sh
noch
nohup einfügen...
User since
2005-01-17
14747
Artikel
Admin1
Gast+2007-12-11 09:29:00--@gwendragon: mein lokales script ist ein interaktives script mit gui usw. das im hintergrund laufen zu lassen hilft mir dann nicht wirklich weiter.
Aha. Jetzt hast du mehr preisgegeben, um welches Programm es sich handelt. Aber weiter oben hast du dich aber sehr schwammig ausgedrückt, welches Programm stoppt und wartet:
QuoteMein Programm stoppt hier aber und wartet auf die Beendigung des Befehls. Wie kann ich einen Befehl im Hintergrund ausführen?
Gedankenlesen kann ich nicht ;)
Zum remote gestarteten Skript selbst:
Du musst dann eben in der Shell $? prüfen, ob es geklappt hat. Hängt aber wieder davon ab, was dein Shell-Skript zurückgibt.
Aber das weist du bestimmt wohl schon.
ja am anfang habe ich auch nicht gedacht, dass es denn wichtig sein könnte, das ich ja eigentlich gehofft hatte, dass es da z.b. einen zusatz operator/option IM net::ssh::perl modul gibt, um die übergebenen commands im hintergrund auszuführen.
Aber nun gut :D
Main hauptprogramm besteht aus einem Gui, in dem u.a. Anzeigen enthalten sind, die sich alle x sekunden aktualisieren.
Zusätzich gibt es noch mehrere Buttons. Bei einem Button wird beim Anklicken der von mir oben beschriebene Code ausgeführt.
Sprich, es wird eine ssh verdindung zu einem anderen PC aufgebaut, das sh-script soll dann dort gestartet werden, die ssh-connection wieder geschlossen und fertig. Das sh-script läuft dann auf dem anderen Rechner noch mehrere Stunden vor sich hin.
Wenn ich jetzt auf den Knopf drücke, dann startet zwar das script auf dem anderen Rechner, aber z.b. hört dann mein Hauptprogramm auf zu arbeiten. Es werden dann u.a. die Anzeigen nicht mehr aktualisiert, etc. Im prinzip ist das ganze Gui nur noch ne weiße Fläche etc.
Also was ich eigenlich wollte ist, dass ich eine Möglichkeit habe per Knopfdruck dem Hauptprogramm zu sagen: verbinde dich mit dem Rechner xyz, starte ein dort vorhandenes shellscript und kümmere dich nicht mehr weiter darum.
So, ich hoffe mal, das reicht für nen kleinen Überblick :D