Stefan Falz: Fehler "script produced no output" bei Perl-Skripten im IIS4

Hallo Gemeinde,

ich hatte heute die wahnwitzige Idee, mal ein Perlskript auf meinem
Server laufen zu lassen. Lokal läuft das Ding auch ganz gut. Da sich
die neueste Version nicht instalieren lässt, habe ich ActivePerl
522, (basiert auf Perl 5.005) installiert.

Bei meinem ISP ist die Perl 5.003 (laut seiner Aussage von ActiveWare
in der DLL-Version) installiert und dort läuft es folgendermaßen:

Wenn die Datei so aussieht:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><a href="test.pl">Hallo Welt</a></body></html>\n";

kommt die korrekte HTML-Ausgabe "Hallo Welt" als Link.

Wenn die Datei so aussieht:

#!/usr/bin/perl
use LWP::Simple;
$URL = "http://www.domain.de/";
$Daten = get $URL;
print "Content-type: text/html\n\n";
print "<html><body>$Daten</body></html>\n";

kommt lediglich die Ausgabe:
'E:\data\user\cgi-bin\test.pl' script produced no output

ich habe auch schon etliche Beispiele ausprobiert, aber sobald irgendwas
von use, require, ... in der Datei steht, kommt die o.a. Ausgabe
Auch im Quelltext steht nichts anderes.

Der Webserver ist beide Male ein NT 4 Server, SP 6a, IIS 4

Wenn ich lediglich zu beschränkt bin (naja ASP fordert einem ja auch
ganz schön was ab), reicht ein kurzer Hinweis. Ich hab zwar schon in
bei ActiveWare und den dort verlinkten Seiten (natürlich auch in der Doku)
gesucht, es beschäftigen sich zwar auch einige Seiten mit dem Thema IIS
und Perl, aber dort gehts meistens um Registry-Einträge und haben
keinen Bezug zu dem o.a. Fehler.

Tschau, Stefan

  1. Hi Stefan,

    ich denke mal, das, was Du mit use, require einbinden willst, ist nicht installiert. Somit bricht das Script ab und die bekommst die Fehlermeldung. Denn nach dem Abbruch des Scripts werden ja auch nicht die print-Anweisungen ausgeführt.

    Prüfe mal, ob die benötigten Module bei Deinem Provider installiert sind.

    Gruß
    Timothy

    1. Hi Stefan,

      ich denke mal, das, was Du mit use, require einbinden willst, ist nicht installiert. Somit bricht das Script ab und die bekommst die Fehlermeldung. Denn nach dem Abbruch des Scripts werden ja auch nicht die print-Anweisungen ausgeführt.

      Prüfe mal, ob die benötigten Module bei Deinem Provider installiert sind.

      Gruß
      Timothy

      Hallo Timothy,

      also eigentlich habe ich es mit den Standardmodulen probiert,
      die laut ActiveState mit intstalliert werden. Auch die WIN32-
      Module bringen denselben Fehler.
      Ich würde zwar gerne prüfen, welche Module verfügbar sind,
      aber in der Doku habe ich hierzu nichts gefunden.

      Wäre nett, wenn mir jemand einen Link auf eine Seite geben
      könnte, die sich mehr mit dem technischen Hintergrund befasst.

      Danke schon mal im voraus.

      Tschau, Stefan

      1. Hi Stefan,

        Wäre nett, wenn mir jemand einen Link auf eine Seite geben
        könnte, die sich mehr mit dem technischen Hintergrund befasst.

        Schau mal ein bißchen weiter unten. Gestern habe ich eine Info ins Forum gestellt bezüglich Debugging von CGI-Scripten. Des weiteren gibt es in SELFAktuell - Feature-Artikel einen interessanten Beitrag von Michael Schröpel("Inbetriebnahme von CGI-Scripten"). Die solltest Du Dir mal zu Gemüte führen.

        Bye
        Timothy

      2. ich denke mal, das, was Du mit use, require einbinden willst, ist nicht installiert.
        Prüfe mal, ob die benötigten Module bei Deinem Provider installiert sind.

        LWP::Simple ist bei ActiveState-Perl dabei (ich habe build 509, das ist um einiges älter).

        Schreib doch mal ein Mini-Testskript "print @INC;" - diese Variable enthält eine Liste von Verzeichnissen, in denen "require" nach den entsprechenden Modulen sucht.
        Vielleicht ist da bei der Installation etwas eingetragen worden, was mit der Realität nicht übereinstimmt?

        Ich würde zwar gerne prüfen, welche Module verfügbar sind,
        aber in der Doku habe ich hierzu nichts gefunden.

        "perl -V" über Kommandozeile eingeben könnte ansatzweise helfen.
        Ansonsten ist ein entsprechendes Kommando erst vor wenigen Tagen hier im Forum gepostet worden (Cheatah? Calocybe?).

        Wäre nett, wenn mir jemand einen Link auf eine Seite geben
        könnte, die sich mehr mit dem technischen Hintergrund befasst.

        Es gibt eine Menge Dokumentation dazu, u. a. http://www.activestate.com/ActivePerl/docs/lib/Pod/perlmod.html, denke ich - im Innenleben der Module bin ich auch nicht so fit.

        1. Hallo!

          Schreib doch mal ein Mini-Testskript "print @INC;" - diese Variable enthält eine Liste von Verzeichnissen, in denen "require" nach den entsprechenden Modulen sucht.
          Vielleicht ist da bei der Installation etwas eingetragen worden, was mit der Realität nicht übereinstimmt?

          An der Stelle wuerde ich auch erstmal suchen. Evtl. sind von einer aelteren Version noch irgendwelche Environmentvariablen gesetzt, die Perl in @INC mit einbezieht. Man sollte mal noch %ENV pruefen:

          print "Content-type: text/plain\n\n";
          print '@INC: ', join(' : ', @INC), "\n";
          print "%ENV: \n";
          print "$_:\t\t$ENV{$_}\n" for (sort keys %ENV);

          Ausserdem gibt es noch ein paar Registry Keys, die @INC beeinflussen. Weiss jetzt aber nicht, welche.

          Ansonsten ist ein entsprechendes Kommando erst vor wenigen Tagen hier im Forum gepostet worden (Cheatah? Calocybe?).

          Ich weiss von nichts. Pruefen, ob ein Modul installiert ist UND auch gefunden wird, kann man jedenfalls mit:

          $have_module = eval { require LWP::Simple };
          if ($have_module) {
            // all fine
          } else {
            die("Can't find that fuckin' module!");
          }

          So lange

          1. print "Content-type: text/plain\n\n";
            print '@INC: ', join(' : ', @INC), "\n";
            print "%ENV: \n";
            print "$_:\t\t$ENV{$_}\n" for (sort keys %ENV);

            Ich weiss von nichts. Pruefen, ob ein Modul installiert ist UND auch gefunden wird, kann man jedenfalls mit:

            $have_module = eval { require LWP::Simple };
            if ($have_module) {
              // all fine
            } else {
              die("Can't find that fuckin' module!");
            }

            Hallo,

            danke erstmal für die Antwort.
            Ich habe beide Sachen ausprobiert.

            #!/usr/bin/perl
            print "Content-type: text/plain\n\n";
            print '@INC: ', join(' : ', @INC), "\n";
            print "%ENV: \n";
            print "$_:\t\t$ENV{$_}\n" for (sort keys %ENV); --> Hier tritt der Fehler auf.

            Wenn ich bei diesem Skript die letzte Zeile auskommentiere. läuft es durch,
            ansonsten kommt der anfangs beschriebene Fehler.

            $have_module = eval { require LWP::Simple };
            if ($have_module) {

            »»   // all fine

            } else {

            »»   die("Can't find that fuckin' module!");

            }

            Das hier bringt egal, was ich auch mache, immer den Fehler "Script produced no output"

            Trotzdem danke, ich werde jetzt erstmal eine Antwort nach der anderen probieren.

            Tschau, Stefan

            1. Hi!

              #!/usr/bin/perl
              print "Content-type: text/plain\n\n";
              print '@INC: ', join(' : ', @INC), "\n";
              print "%ENV: \n";
              print "$_:\t\t$ENV{$_}\n" for (sort keys %ENV); --> Hier tritt der Fehler auf.

              Wenn ich bei diesem Skript die letzte Zeile auskommentiere. läuft es durch,
              ansonsten kommt der anfangs beschriebene Fehler.

              Nun, mit aelteren Perl-Interpretern laeuft das so tatsaechlich nicht. Wenn Du aber wirklich ActivePerl Build 522 hast, muesste es gehen. Wenn man es zu
              for (sort keys %ENV) { print("$_:\t\t$ENV{$_}\n") }
              umformt, geht es aber auch auf aelteren Perls.

              Das hier bringt egal, was ich auch mache, immer den Fehler "Script produced no output"

              Das war natuerlich nur ein Fragment, um zeigen wie es im Prinzip funktioniert. Ein ganzes Script wuerde so aussehen:

              print "Content-type: text/plain\n\n";
              $have_module = eval { require LWP::Simple };
              print($have_module ? "Module is there." : "Can't find that fuckin' module!");

              So lange

        2. Ansonsten ist ein entsprechendes Kommando erst vor wenigen Tagen hier im Forum gepostet worden (Cheatah? Calocybe?).

          Ich glaube, das bezog sich auf Cheatahs <../../sfarchiv/2000_2/t12675.htm#a65231>.

          Wobei "ppm" (das ich gerade zum ersten Mal ausprobiert habe) weitaus mehr kann als nur Module installieren - insbesondere auch auflisten, was alles da ist.
          (In diesem Kontext gehört "LWP::Simple" allerdings bei ActiveState offenbar zu "libwww-perl", was wiederum nicht für jeden leicht zu verstehen ist.)

          1. Wobei "ppm" (das ich gerade zum ersten Mal ausprobiert habe) weitaus mehr kann als nur Module installieren - insbesondere auch auflisten, was alles da ist.

            Das ist der Perl Package Manager, afaik eine Entwicklung von ActiveState. Module installieren ist denkbar einfach damit. Die ZIP mit den bereits ge-make-ten Modulen von ActiveState runterladen, ppm mit der entsprechenden Datei aufrufen (steht in der Readme in dem zip), fertig. Selbst die HTML-Dokumentation wird automatisch neu generiert.

            (In diesem Kontext gehört "LWP::Simple" allerdings bei ActiveState offenbar zu "libwww-perl", was wiederum nicht für jeden leicht zu verstehen ist.)

            Es ist ein Teil von LWP. LWP steht fuer LibWwwPerl. Da gehoeren diverse Module dazu, unter anderem LWP::Simple und LWP::UserAgent, aber auch z.B. HTTP::Headers. Die Module sind alle voneinander abhaengig und alleine kaum sinnvoll. Alle zusammen sind sie in der libwww-perl-x.xx.tar.gz bei CPAN erhaeltlich.
            LWP::Simple ist lediglich ein vereinfachtes Interface zu LWP::UserAgent.

            So lange

            1. Das ist der Perl Package Manager, afaik eine Entwicklung von ActiveState. Module installieren ist denkbar einfach damit. Die ZIP mit den bereits ge-make-ten Modulen von ActiveState runterladen, ppm mit der entsprechenden Datei aufrufen (steht in der Readme in dem zip), fertig. Selbst die HTML-Dokumentation wird automatisch neu generiert.

              noch einfacher geht es mit dem VPM (Visual Package Manager).

              http://www.activestate.com/ppmpackages/5.005/

              Bye
              Timothy

            2. Wobei "ppm" (das ich gerade zum ersten Mal ausprobiert habe) weitaus mehr kann als nur Module installieren - insbesondere auch auflisten, was alles da ist.

              Das ist der Perl Package Manager, afaik eine Entwicklung von ActiveState. Module installieren ist denkbar einfach damit. Die ZIP mit den bereits ge-make-ten Modulen von ActiveState runterladen, ppm mit der entsprechenden Datei aufrufen (steht in der Readme in dem zip), fertig. Selbst die HTML-Dokumentation wird automatisch neu generiert.

              (In diesem Kontext gehört "LWP::Simple" allerdings bei ActiveState offenbar zu "libwww-perl", was wiederum nicht für jeden leicht zu verstehen ist.)

              Es ist ein Teil von LWP. LWP steht fuer LibWwwPerl. Da gehoeren diverse Module dazu, unter anderem LWP::Simple und LWP::UserAgent, aber auch z.B. HTTP::Headers. Die Module sind alle voneinander abhaengig und alleine kaum sinnvoll. Alle zusammen sind sie in der libwww-perl-x.xx.tar.gz bei CPAN erhaeltlich.
              LWP::Simple ist lediglich ein vereinfachtes Interface zu LWP::UserAgent.

              So lange

              Hallo,

              danke auch für deine Antwort. Allerdings kann ich PPM nicht auf dem
              Server meines ISP ausführen. Allerdings kann ich mir alle Dateien anschauen (zumindest vom Dateinamen her sollte mir das etwas Aufschluss
              geben). Ich habe zwar unter lib ca. 15 Verzeichnisse, darunter auch Win32,
              aber wo jetzt was stehen soll, weiß ich nicht.

              Ich habe auch mal dein Beispiel ausprobiert:

              #!/usr/bin/perl
              print "Content-Type: text/plain\n\n";
              print "Hallo";
              foreach my $p (sort keys %ENV) { print "$p=$ENV{$p}\n"; }

              Wenn die letzte Zeile auskommentiert wird, kommt die Ausgabe "Hallo".
              Wenn ich sie nicht auskommentiere, kommt gar nichts an, 0 Byte, leere Seite ???

              Naja, ich werde jetzt erst mal meinen ISP fragen, ob irgendwelche Restriktionen
              zu beachten sind.

              Trotzdem danke für die Mühe.

              Tschau, Stefan

              1. danke auch für deine Antwort. Allerdings kann ich PPM nicht auf dem
                Server meines ISP ausführen. Allerdings kann ich mir alle Dateien anschauen (zumindest vom Dateinamen her sollte mir das etwas Aufschluss
                geben). Ich habe zwar unter lib ca. 15 Verzeichnisse, darunter auch Win32,
                aber wo jetzt was stehen soll, weiß ich nicht.

                LWP::Simple steht bei mir in <perlroot>\lib\LWP\Simple.pm.
                Der Doppelpunkt entspricht also offenbar einer Verzeichnisebene.

                1. Hi Michael!

                  LWP::Simple steht bei mir in <perlroot>\lib\LWP\Simple.pm.

                  Bei mir (ActivePerl, verschiedene Builds) in <perlroot>\site\lib\LWP\Simple.pm.
                  Unter lib stehen nur die Standard modules, unter site/lib stehen die, die ActiveState ausserdem fuer ihre Distribution ausgewaehlt haben (meist von CPAN).

                  Der Doppelpunkt entspricht also offenbar einer Verzeichnisebene.

                  Ach wirklich? ;-)  perldoc -f require: If EXPR is a bareword, the require assumes a .pm'' extension and replaces ::'' with ``/'' in the filename for you, to make it easy to load standard modules.

                  So lange

  2. Hallo Stefan,

    Wenn die Datei so aussieht:

    #!/usr/bin/perl
    use LWP::Simple;
    $URL = "http://www.domain.de/";
    $Daten = get $URL;
    print "Content-type: text/html\n\n";
    print "<html><body>$Daten</body></html>\n";

    kommt lediglich die Ausgabe:
    'E:\data\user\cgi-bin\test.pl' script produced no output
    Tschau, Stefan

    versuch es mal so:

    #!/usr/bin/perl
    use LWP::Simple;
    print "Content-type: text/html\n\n";
    $URL = "http://www.domain.de/";
    $Daten = get $URL;
    print "<html><body>$Daten</body></html>\n";

    Ist überhaupt "Simple" verfügbar?
    Wie kann man zu einem Provider gehen, der kein LINUX benutzt?

    mfg Fridolin

    1. versuch es mal so:

      »»  #!/usr/bin/perl
      »»  use LWP::Simple;
      »»  print "Content-type: text/html\n\n";
      »»  $URL = "http://www.domain.de/";
      »»  $Daten = get $URL;
      »»  print "<html><body>$Daten</body></html>\n";

      Ist überhaupt "Simple" verfügbar?
      Wie kann man zu einem Provider gehen, der kein LINUX benutzt?

      mfg Fridolin

      Hallo,

      ich habe es probiert, aber ohne Erfolg, gleiches Ergebnis, wennn man
      davon absieht, das manchmal auch die Fehlermeldung nicht mehr erscheint, aber
      trotzdem keine Ausgabe erfolgt.

      Da ich mit hauptsächlich mit ASP beschäftige, bringt mir ein Provider
      mit Linux zur Zeit gar nichts. Aber mal sehen, vielleicht in Zukunft.

      Danke nochmal für deinen Tip.

      Tschau, Stefan

      1. versuch es mal so:

        »»  #!/usr/bin/perl
        »»  use LWP::Simple;
        »»  print "Content-type: text/html\n\n";
        »»  $URL = "http://www.domain.de/";
        »»  $Daten = get $URL;
        »»  print "<html><body>$Daten</body></html>\n";

        Ist überhaupt "Simple" verfügbar?
        Wie kann man zu einem Provider gehen, der kein LINUX benutzt?

        mfg Fridolin

        Hallo,

        ich habe es probiert, aber ohne Erfolg, gleiches Ergebnis, wennn man
        davon absieht, das manchmal auch die Fehlermeldung nicht mehr erscheint, aber
        trotzdem keine Ausgabe erfolgt.

        Das bedeutet, es gelingt der Maschine nicht den Zugriff auf die URL abzuschließen, eventuell ist der Rechner auf den du zugreifst zu lahm, oder das DNS ist lahm, usw.

        Du hast nicht beantwortet ob Simple überhaupt verfügbar ist!

        Da ich mit hauptsächlich mit ASP beschäftige, bringt mir ein Provider
        mit Linux zur Zeit gar nichts.

        Unter LINUX heisst das was du ASP nennst PHP3 und ist wie alles unter LINUX zigmal besser als der M$ Kram.

        Es gibt Scripte die ASP in PHP3 übersetzen...

        Aber mal sehen, vielleicht in Zukunft.

        Vieleicht hast du ja Glück.

        Danke nochmal für deinen Tip.

        Tschau, Stefan

        Dein Programm macht das folgende:
        1.) Es versucht per DNS die IP des Rechners zu finden der in URL steht.
        2.) Es versucht von diesem Rechner die angegegeben Seite zu laden

        Zu diesem Zeitpunkt hast du bereits drei Möglichkeiten das dein Prog. nicht zum Ende kommt, aber noch NULL Ausgabe im Buffer.

        Das ist taktisch sehr schlecht.

        Du solltest zuerst den Output Buffer auf Durchzug schalten,
        dann etwas ausgeben
        und dann erst versuchen via Simple die Daten zu bekommen.

        Ich will dich nicht beleidigen, aber hast du bei den Test www.domain.de in URL stehen? Und funktioniert diese URL?

        mfg Fridolin

        1. Das bedeutet, es gelingt der Maschine nicht den Zugriff auf die URL abzuschließen, eventuell ist der Rechner auf den du zugreifst zu lahm, oder das DNS ist lahm, usw.

          Du hast nicht beantwortet ob Simple überhaupt verfügbar ist!

          siehe http://www.teamone.de/selfaktuell/forum/messages/66633.html

          Da ich mit hauptsächlich mit ASP beschäftige, bringt mir ein Provider
          mit Linux zur Zeit gar nichts.

          Unter LINUX heisst das was du ASP nennst PHP3 und ist wie alles unter LINUX zigmal besser als der M$ Kram.

          Es gibt Scripte die ASP in PHP3 übersetzen...

          Aber mal sehen, vielleicht in Zukunft.

          Vieleicht hast du ja Glück.

          ich kenne PHP3, aber da die meisten meiner Kunden nun mal NT Server im
          Intra- Internet nutzen, und MS bei diesen Unternehmen Vorrang hat,
          kann ich denen nicht mit LAMP ankommen.

          Dein Programm macht das folgende:
          1.) Es versucht per DNS die IP des Rechners zu finden der in URL steht.
          2.) Es versucht von diesem Rechner die angegegeben Seite zu laden

          Zu diesem Zeitpunkt hast du bereits drei Möglichkeiten das dein Prog. nicht zum Ende kommt, aber noch NULL Ausgabe im Buffer.

          Das ist taktisch sehr schlecht.

          Du solltest zuerst den Output Buffer auf Durchzug schalten,
          dann etwas ausgeben
          und dann erst versuchen via Simple die Daten zu bekommen.

          Wie gesagt, war das mein erster Test mit Perl, daher verstehe ich zwar
          die Funktionsweise des Skripts, aber mit "Output Buffer auf Durchzug schalten"
          kann ich in diesem Bezug nichts anfangen.

          Ich will dich nicht beleidigen, aber hast du bei den Test www.domain.de in URL stehen? Und funktioniert diese URL?

          Ich habe mehrere Domains ausprobiert, im Test auch http://www.domain.de
          und sie funktioniert, wenn XLink auch sagt, daß diese Domain zur Zeit
          nicht erreichbar ist.

          Trotzdem danke,

          Stefan

  3. Hallo,

    ich wollte mich nochmal bei allen bedanken und nur kurz Bescheid geben,
    daß ich die Lösung in einem Posting gefunden habe.
    Man kann die Ordner (unter lib) einzeln ins cgi-bin uploaden und
    dann funzt es.

    Ist eigentlich ganz einfach, man muss es nur wissen.

    Tschau, Stefan

    1. ich wollte mich nochmal bei allen bedanken und nur kurz Bescheid geben,
      daß ich die Lösung in einem Posting gefunden habe.
      Man kann die Ordner (unter lib) einzeln ins cgi-bin uploaden und
      dann funzt es.

      Heißt das, die Module waren schon da, aber @INC hat sie nicht gefunden?
      Eben deshalb wollte ich ja den Inhalt von @INC sehen - den Du übrigens in Deinem Skript auch selbst setzen kannst, statt die ganzen Module zu duplizieren ...

      1. ich wollte mich nochmal bei allen bedanken und nur kurz Bescheid geben,
        daß ich die Lösung in einem Posting gefunden habe.
        Man kann die Ordner (unter lib) einzeln ins cgi-bin uploaden und
        dann funzt es.

        Heißt das, die Module waren schon da, aber @INC hat sie nicht gefunden?
        Eben deshalb wollte ich ja den Inhalt von @INC sehen - den Du übrigens in Deinem Skript auch selbst setzen kannst, statt die ganzen Module zu duplizieren ...

        Hallo Michael,

        da ich in Sachen Perl noch nicht so sehr bewandert bin, kann ich Dir nicht
        genau sagen, wieso es nach dem Upload (zumindest teilweise) geklappt hat.
        LWP::Simple findet er, HTTP::UserAgent nicht, ...
        Naja, ich werde mich jetzt erstmal schlau machen, nur wenn das Grundlegende
        schon nicht funktioniert, steht man als Newbie ganz schön doof da.
        Daher mein Posting.

        So long,

        Stefan