Zimmi: Skript ist nach dem Hochladen nicht zum laufen zu kriegen

Hi zusammen!

Ich hab' ein Problem mit einem Perl-Skript, dass ich die letzten Tage geschrieben habe.
Lokal auf meinem Web-Server läuft es tadellos, aber wenn ich es ins Internet hochlade, dann geht nichts. Fehlernummer 500, Internal Server Error.
Ich betreibe im selben Verzeichnis noch einige andere Skripte, die auch ordnungsgemäß funktionieren. Die Zugriffsrechte sind korrekt gesetzt. Alle Tipps in SelfHTML habe ich beachtet. Schön im ASCII-Modus hochgeladen usw.
Im Laufe des Skriptes lese ich eine Datei aus. Wenn ich hier einen nicht vorhandenen Dateinamen angebe, dann bricht das Skript wie vorgesehen mit der entsprechenden Fehlermeldung ab. Aber sobald ich eine korrekte Datei angebe, kommt der obengenannte Fehler 500.

Hat jemand einen Tipp, woran das noch liegen könnte? mich wundert eben gerade, dass es lokal fehlerfrei funktioniert.

Vielen Dank schonmal!

Zimmi

  1. Was sagt denn Dein httpd-Log (also z.B. /var/log/httpd/errors)?

    1. Was sagt denn Dein httpd-Log (also z.B. /var/log/httpd/errors)?

      Ich denk' mal, dass ich da keine Leseberechtigung habe. Zumal ich keine Ahnung habe, auf welchem Server das Skript eigentlich genau läuft. Da gibt's nämlich mehrere, die in Frage kommen.

      1. Habe mir Deinen Codeschnipsel angesehen.

        Passiert der Fehler unmittelbar bei "my @Zeilen..." oder erst im folgenden "foreach"-Block? Wenn er direkt beim Einlesen passiert, hast Du schon mal eine weniger elegante Ersatzkonstruktion versucht, z.B.

        while ( defined($var=<FILENAME>) )
        {
        }

        1. Passiert der Fehler unmittelbar bei "my @Zeilen..." oder erst im folgenden "foreach"-Block? Wenn er direkt beim Einlesen passiert, hast Du schon mal eine weniger elegante Ersatzkonstruktion versucht, z.B.

          while ( defined($var=<FILENAME>) )
          {
          }

          Hab's mal so getestet. Gleicher Effekt.

          Kannst Du mir vielleicht allgemein ein paar Vorschläge machen, was für Debug-Möglichkeiten es da gibt? Muss ich jetzt das ganze Skript zerpflücken, jedes Teil einzeln hochladen und testen, ob's funktioniert?
          Das Problem ist halt, dass ich's nicht auf der Konsole testen kann, weil das mit den Übergabewerte da ja anders funktioniert und die CGI-Umgebungsvariablen nicht gesetzt werden. Und jetzt steh' ich ein bißchen ratlos da, wie ich da auf den Fehler kommen kann.
          Vielen Dank jedenfalls schonmal für die Tipps!

          1. Oh, bitte glaub´ nicht ich hätte die Weisheit mit Löffeln gefressen.

            Ehrlich gesagt, habe ich mir einen alten P133 neben meine Windoof-Möhre gestellt und kann da ganz prima testen, weil ich über LAN mit dem IE oder aus dem X-Server mit NetScape oder Konqueror auf den Apache gehe, also eine Logdatei habe und obendrein jederzeit ein kleines "die ('hallo');" einbauen kann.

            Tolle Tricks habe ich nicht auf Lager, sorry.

            Wenn Du immer neu hochladen mußt und keinen Telnet-Zugang zu Deinem Server hast (um direkt mit vi zu editieren) rate ich Dir aber ein ftp-Script zu verwenden (okay, WS-ftp & Co. sind bequem, aber ein Skript ist noch bequemer).
            Was das mit den Tests auf der Konsole angeht (falls Du eine hast), setze halt die Umgebungsvariable "QUERY_STRING" und schon kannst Du einen cgi-Aufruf simulieren. Wußtest Du schon? Ich sagte ja, ich bin nicht Mr. Wonderful...

            1. Ehrlich gesagt, habe ich mir einen alten P133 neben meine Windoof-Möhre gestellt und kann da ganz prima testen, weil ich über LAN mit dem IE oder aus dem X-Server mit NetScape oder Konqueror auf den Apache gehe, also eine Logdatei habe und obendrein jederzeit ein kleines "die ('hallo');" einbauen kann.

              Praktische Sache :-)

              Was das mit den Tests auf der Konsole angeht (falls Du eine hast), setze halt die Umgebungsvariable "QUERY_STRING" und schon kannst Du einen cgi-Aufruf simulieren. Wußtest Du schon? Ich sagte ja, ich bin nicht Mr. Wonderful...

              ne, wußte ich nicht! Danke schön, da mach' ich mich gleich nochmal ans testen...

  2. hallo zimmi,

    Hat jemand einen Tipp, woran das noch liegen könnte? mich wundert eben gerade, dass es lokal fehlerfrei funktioniert.

    lokal -> windows/linux?

    ohne ein paar codeschnipsel schwer zu sagen.
    schmeiss doch mal ein bisschen deines scripts rüber, dann gehts viel schneller, dir zu helfen.

    viele grüße,
    bruno

    1. lokal -> windows/linux?

      lokal windows.

      ohne ein paar codeschnipsel schwer zu sagen.
      schmeiss doch mal ein bisschen deines scripts rüber, dann gehts viel schneller, dir zu helfen.

      OK: Hier der Ausschnitt, der die Datei ausliest:

      sub KonfigurationAuslesen {
          my $wert1; my $wert2;
          # Zuerst die Übergabewerte auswerten
          my @parameter = split(/&/, $ENV{QUERY_STRING});
          foreach (@parameter) {
             ($wert1, $wert2) = split(/=/, $_);
             if ($wert1 eq "Galerie") {$URLGalerie=$wert2}
             elsif ($wert1 eq "BildAnzeigen") {$BildNummer=$wert2};
          } # of foreach @parameter

      # Die Konfigurationsdatei wird geöffnet
          open (DATEI, "<$URLGalerie") || die ("Galeriedatei $URLGalerie nicht gefunden!");
          my @Zeilen = <DATEI>;
          close(DATEI);

      foreach(@Zeilen) {
             # Zuerst alle Zeilen, die mit # beginnen, entfernen.
             $_ =~ s/^#.*//;
             # Jetzt prüfen, ob es sich um eine Leerzeile handelt
             if ($_ !~ /^\s*\n/){
                # Zuerst prüfen, ob ein ; vorkommt, in diesem Fall in Bilderarray schreiben
                if ($_ =~ /;/) {
                   ($wert1, $wert2) = split(/;/, $_);
                   push(@Bilder,[$wert1,$wert2]);
                } # of if ;
                # Ansonsten testen, ob ein = enthalten ist.
                elsif ($_ =~ /=/) {
                   ($wert1,$wert2) = split(/=/, $_);
                   if ($wert1 eq "PfadZuBildern") {$PfadZuBildern=$wert2}
                   elsif ($wert1 eq "Titel") {$Titel=$wert2}
                   elsif ($wert1 eq "Background") {$Background=$wert2}
                } # of elsif =
             } # of if keine Leerzeile
          } # of foreach @Zeilen
      } # of sub KonfigurationAuslesen

      1. Noch eine Anmerkung:

        # Die Konfigurationsdatei wird geöffnet
            open (DATEI, "<$URLGalerie") || die ("Galeriedatei $URLGalerie nicht gefunden!");
            my @Zeilen = <DATEI>;
            close(DATEI);

        Wenn ein Dateiname einer nicht vorhandenen Datei angegeben wird, dann bricht's korrekt ab und bringt die obenstehende Fehlermeldung. Ansonsten kommt der Internal Server Error.

        1. Hallo,

          Also erstens solltest Du schleunigst dafür sorgen, daß Du den Error-Log einsehen kannst. Ohne diese Information ist das Fehlersuchen praktisch mit einem Blindflug ohne Instrumenten vergleichbar.

          Wenn ein Dateiname einer nicht vorhandenen Datei angegeben wird, dann bricht's korrekt ab und bringt die obenstehende Fehlermeldung. Ansonsten kommt der Internal Server Error.

          Nachdem, soweit ich es sehen konnte, innerhalb der Funktion 'KonfigurationAuslesen' nach dem Dateieinlesen nichts 'gefährliches' passieren kann, muß der Fehler nach dem Funktionsaufruf erfolgen.

          Da wir hier aber nicht wissen, was dann passiert, bzw. passieren soll, (bitte nicht das ganze Script posten, eventuell machst Du es für uns auf Deinem Server verfügbar), und vor allem nicht, was im Error-Log steht, können wir auch keinen halbwegs brauchbaren Tip abgeben, woran es liegen kann. Und da sind wir wieder bei erstens;-)

          Grüße
            Klaus

      2. hi zimmi,

        # Die Konfigurationsdatei wird geöffnet
            open (DATEI, "<$URLGalerie") || die ("Galeriedatei $URLGalerie nicht gefunden!");

        poste doch mal, was genau in der "$URLGalerie" drinsteht, genau vor dem öffnen der datei und der fehlermeldung...
        (also unter deiner windowsumgebung reicht)

        gruß,
        bruno

  3. use Mosche;

    Ich hab' ein Problem mit einem Perl-Skript, dass ich die letzten Tage geschrieben habe.
    Lokal auf meinem Web-Server läuft es tadellos, aber wenn ich es ins Internet hochlade, dann geht nichts. Fehlernummer 500, Internal Server Error.
    Ich betreibe im selben Verzeichnis noch einige andere Skripte, die auch ordnungsgemäß funktionieren. Die Zugriffsrechte sind korrekt gesetzt. Alle Tipps in SelfHTML habe ich beachtet. Schön im ASCII-Modus hochgeladen usw.
    Im Laufe des Skriptes lese ich eine Datei aus. Wenn ich hier einen nicht vorhandenen Dateinamen angebe, dann bricht das Skript wie vorgesehen mit der entsprechenden Fehlermeldung ab. Aber sobald ich eine korrekte Datei angebe, kommt der obengenannte Fehler 500.

    Da du ja nicht in die Logdatei einsehen kannst, benutze wenigstens CGI::Carp:

    use CGI::Carp qw(fatalsToBrowser);

    das sollte die Fehlermeldung anzeigen.

    use Tschoe qw(Matti);

  4. Ich hab's inzwischen zum Laufen gekriegt! Rätsels Lösung war ganz einfach: Ich hab' in meiner großen Weisheit vergessen, am Beginn des HTML-Textes
    Content-type: text/html
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    oder sowas anzugeben.
    Rausgefunden hab' ich's über tausend mal die('nix wars') und Skript neu hochladen.

    Danke an alle, die geantwortet haben!