Perl "system" Fehler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Perl "system" Fehler

Beitrag von roli » 01.03.2005 13:01:52

Hi Leute,

irgendwie blick ich's nicht, folgende Perl "Funktion" macht mich verrueckt:

Code: Alles auswählen

sub show_server_info
{
  print "show_server_info\n";
  my $localvar = "";
  $localvar = system("/bin/uname -a");
  print "  $localvar\n";
  return $localvar;
}
Hier die Fehlermeldung die ich bekomme:

Code: Alles auswählen

show_server_info
Can't exec "/bin/uname": No such file or directory at ./perl-server.pl line 312, <GEN1> line 8.
  -1
Das Script laeuft als normaler user, der auch "/bin/uname" ausführen darf. Was uebersehe ich?
Was heisst eigentlich "<GEN1> line 8"?
In localvar landet der Retuncode der von System ausgefuehrten Funktion, wie komme ich aber an den Output, den die Funktion liefert? Aus perldoc -f system werde ich nicht wirklich schlau.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 01.03.2005 13:26:06

Also die Funktion an sich fuktioneirt. Kannst du das ganze Script vielleicht mal unter http;//nopaste.debianforum.de online stellen?

Welche Rechte hat das Script? (ls -l bitte)

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

harre
Beiträge: 65
Registriert: 22.11.2004 18:50:51
Wohnort: München

Beitrag von harre » 01.03.2005 14:09:41

Servus,

mit

Code: Alles auswählen

$localvar = `/bin/uname -a`;
sollte es funktionieren...


Gruß
Harre

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

Beitrag von roli » 01.03.2005 14:36:45

Jo, jo,

man kann ja so bloed sein!
Ich wollte eben das Script auf "NoPaste" hochladen, dabei habe ich mir den Anfang nochmal angesehen, und siehe da ich habe den Fehler erkannt. Ich bin dabei eine Client/Server Anwendung zu bauen, und habe halt im Moment u. a. noch Infos hardcoded im Script die ich dann rausnehme, wenn sicher bin das ich's ueberhaupt hinbekomme, bzw. gerade eben rausnehmen wollte.
Ich habe ein "Script Rumpf" gefunden (leider weiss ich nichtmehr woher), der einen chroot durchfuehrt, leider ist "uname" halt nicht in dem Jail. Kaum nimmt man den chroot raus geht's!

<edit>
Wobei jetzt halt nur die erste meiner drei Fragen geloest ist, Nr 2 und 3 waeren immer noch offen:
-Was heisst eigentlich "<GEN1> line 8"?
-In localvar landet der Retuncode der von System ausgefuehrten Funktion, wie komme ich aber an den Output, den die Funktion liefert? Aus perldoc -f system werde ich nicht wirklich schlau.
</edit>
Danke
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.03.2005 16:31:59

Frage 2:
kann es sein, daß du gerade ein File <GEN1> bearbeitest und dich dort in der Zeile 8 befindest ?

Frage 3:

Code: Alles auswählen

open (PIPE, "/bin/uname -a  |");
$unametxt=<PIPE>;
close(PIPE)

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

Beitrag von roli » 01.03.2005 16:56:36

gms hat geschrieben:Frage 2:
kann es sein, daß du gerade ein File <GEN1> bearbeitest und dich dort in der Zeile 8 befindest ?
Noe, das(/der?) CodeSchnipsel den ich in meinem ersten Posting eingefügt habe, stammt aus meinem Server Script, da habe ich kein File geöffnet, nur einen Socket.
gms hat geschrieben:Frage 3:

Code: Alles auswählen

open (PIPE, "/bin/uname -a  |");
$unametxt=<PIPE>;
close(PIPE)
Danke, das ist natuerlich eine Variante die Funktioniert, aber ich wuerde gerne verstehen wie ich folgenden Satz aus "perldoc -f stderr" zu verstehen habe:

Code: Alles auswählen

This is not what you want to use to capture the output from a command, for that you should use merely backticks or "qx//", as described in "`STRING`" in perlop.
Wenn man dann weiter sucht in der Doku, dann steht da zwar wie man an den Output kommt (insofern kein Verständnisproblem), aber wie komme ich dann, bzw. bei deiner Loesung, an der Retuncode des ausgefuehrten Befehls, das habe ich halt noch niergends gefunden?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.03.2005 17:22:28

richtig, in deinem Fall ist folgendes besser:

Code: Alles auswählen

$unametext=`/bin/uname -a`;
die Variante mit PIPE ist besser für längere Texte.

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

Beitrag von roli » 01.03.2005 18:51:40

gms hat geschrieben:

Code: Alles auswählen

$unametext=`/bin/uname -a`;
Ok, so habe ich das was auf STDOUT landet, gibt's jetzt auch noch die Moeglichkeit STDERR irgendwie abzufangen, und vor allem, wie komme ich an den Retuncode des Programms?

Uebrigens, ich habe eben mal angefangen mein Script mit dem Perl Debuger "durch zu steppen", das <GEN1> ist wohl der Socket, so wie ich das verstehe. Die Stelle an der ich diesen String zum ersten mal gefunden habe, ist jedenfalls eine an der ich mit dem Socket arbeite.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.03.2005 19:14:20

was verstehst du unter "abfangen" ?

so kannst du STDERR in /dev/null umleiten:

Code: Alles auswählen

gms@gms1:~$ perl -e '$x=`uname -a 2>/dev/null` or $x="failed";print $x;'
Linux gms1 2.6.10-dk2-6 #1 Sat Feb 12 01:36:41 CET 2005 i686 GNU/Linux

Benutzeravatar
puddlejumper
Beiträge: 58
Registriert: 22.01.2005 00:29:52

Beitrag von puddlejumper » 01.03.2005 20:25:41

Hi,

An den Returncode des letzten ausgeführten Kommandos via z.B. Backticks `` kommst Du über die Variable $?.

und an STDERR kommt Du entweder über die Funktion "open3" über "use IPC::Open3", oder einfacher:

$erg = `doSomething 2>&1`;

Gruss,
PuddleJumper.

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

Beitrag von roli » 02.03.2005 10:38:37

Hi PuddleJumper,
puddlejumper hat geschrieben:An den Returncode des letzten ausgeführten Kommandos via z.B. Backticks `` kommst Du über die Variable $?.
Super, diese Variable kannte ich bisher nur aus der Shell.
puddlejumper hat geschrieben:und an STDERR kommt Du entweder über die Funktion "open3" über "use IPC::Open3", oder einfacher:
$erg = `doSomething 2>&1`;
Das ich STDERR an STDOUT anhaengen kann ist mir klar, aber dann darin das zu finden was man sucht (vorausgesetzt man weiss so genau was man sucht) wird mit zunemender Menge an Output schwieriger, daher hoert sich das "open3" fuer mich vielversprechender an.

Vielen Dank
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Antworten