open-Funktion verursacht Internal Server Error
DeWitt
- perl
0 Frank Schönmann0 ortenau-s-bahner0 Struppi0 DeWitt
Hi,
Ich habe ein ziemlich nerviges Problem: Seit gestern funktionieren meine Scripts nicht mehr. Ich ging auf meine Seite und bekam einfach einen "Internal Server Error". (Ich hatte in der Zwischenzeit nichts verändert, aber vielleicht hat gestern mein Server-Provider eine neue Apache-Version o.ä. aufgespielt.)
Anscheinend tritt das Problem aber nur bei Scripts auf, die die open-Funktion verwenden, da der Fehler nicht mehr kommt, wenn ich die open-Befehle entferne. Als Test habe ich ein ganz simples Programm geschrieben, das einfach eine Datei öffnen und ausgeben soll.
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
#Header ausgeben
print "Content-type: text/html\n\n";
#Datei öffnen
my $url = "test.dat";
open(data, "<$url") || die "Datei '",$url,"' nicht gefunden";
my @log = <data>;
close(data);
chomp(@log);
Wie gesagt, die üblichen Fehler (keine Rechte, falsches Dateiformat, etc.) scheiden aus, da das Script läuft, wenn den open-Befehl entferne. Auch die Datei "test.dat" existiert im selben Verzeichnis wie das Test-Script.
Vielleicht gibt es ja jemand, der mal ein ähnliches Problem hatte oder eine "sauberere" Verwendung des open-Befehls weiß.
hi!
Ich habe ein ziemlich nerviges Problem: Seit gestern funktionieren meine Scripts
nicht mehr. Ich ging auf meine Seite und bekam einfach einen "Internal Server Error".
(Ich hatte in der Zwischenzeit nichts verändert, aber vielleicht hat gestern mein
Server-Provider eine neue Apache-Version o.ä. aufgespielt.)Anscheinend tritt das Problem aber nur bei Scripts auf, die die open-Funktion
verwenden, da der Fehler nicht mehr kommt, wenn ich die open-Befehle entferne.
Als Test habe ich ein ganz simples Programm geschrieben, das einfach eine Datei
öffnen und ausgeben soll.
Vielleicht hat die Datei, die du auslesen willst, die falschen Dateirechte, so dass der
Webserver (oder der User, der die Skripts ausfuehrt) sie nicht lesen darf. "Internal
Server Error" tritt immer auf, wenn das Skript einen Fehler erzeugt, sagt also nicht viel
aus. Am besten siehst du im Error-Logfile nach, was genau den Fehler verursacht hat.
bye, Frank!
Am besten siehst du im Error-Logfile nach, was genau den Fehler verursacht hat.
Das ist zwar fast ein wenig peinlich, aber genau hier gibt es ein weiteres Problem: Ich weiß nicht, wie ich auf die logfile zugreifen kann. Ich kenne mich kaum mit Linux-Konsolenbefehlen aus und finde somit die Logfile per telnet nicht.
(Normalerweise teste ich die Scripts auf meinem lokalen Server, aber der generiert hier ja keinen Fehler :(.)
Wo befindet sich die Logfile normalerweise (falls man das überhaupt pauschal sagen kann)?
hi,
Wo befindet sich die Logfile normalerweise (falls man das überhaupt pauschal sagen kann)?
hast Du kein ftp browser wie z.B. TotalCommander?
Ich hab zwar auch eine console direkt vom webbrowser aus zum server,aber die daten
lade ich mit einem ftp-browser hoch und damit sollte man auch in den ordner var/log/error_log (bei mir jetzt)kommen können,
die Du downloaden kannst oder direkt per bearbeiten ansicht sehen.
Beim provider puretec oder 1und1 ist das glaub ich nicht möglich,die error_log einzusehen,falls du dort sein solltest.
Sonst würd ich mal Dein provider fragen,wie oder wo Du die error_log sehen kannst.
Gruss
Alain
Hi,
Ich habe ein ziemlich nerviges Problem: Seit gestern funktionieren meine Scripts nicht mehr. Ich ging auf meine Seite und bekam einfach einen "Internal Server Error". (Ich hatte in der Zwischenzeit nichts verändert, aber vielleicht hat gestern mein Server-Provider eine neue Apache-Version o.ä. aufgespielt.)
Dann wende dich doch an deinen Hoster und schildere denen das Problem. Die müssten ja wissen, ob und was sie gemacht haben.
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<HTML><HEAD><TITLE>Test</TITLE></HEAD><BODY>\n";
print "<H1>Inhalt von '",$url,"':</H1>\n";
print "<TT>\n";
Kann man im Übrigen viel einfacher schreiben:
print "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<HTML><HEAD><TITLE>Test</TITLE></HEAD><BODY>
<H1>Inhalt von '",$url,"':</H1>
<TT>\n";
HTH
ortenau-s-bahner
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);#Header ausgeben
print "Content-type: text/html\n\n";
#Datei öffnen
my $url = "test.dat";
open(data, "<$url") || die "Datei '",$url,"' nicht gefunden";
Du kanst dir hier den Grund angeben lassen, warum das fehlschlug und mußt nicht raten (Datei nicht gefunden ist nur eione von zig Möglichkeiten).
open(data, "<$url") || die "Fehler beim öffnen von '$url'. Grund: $!";
(Übrigens sollen Filhandle in Großbuchstaben geschrieben werden, wenn du dich an ein paar Konventionen hälst, fällt es dir leichter deine und andere Programme zu lesen)
my @log = <data>;
close(data);
chomp(@log);
Man kann das zusamenfassen:
chomp (my @log = <data>);
close data;
#HTML-Ausgabe
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<HTML><HEAD><TITLE>Test</TITLE></HEAD><BODY>\n";
print "<H1>Inhalt von '",$url,"':</H1>\n";
print "<TT>\n";
Hier bieten sich here Dokumente an oder die Verwendung des CGI Moduls.
print CGI::header(), CGI::start_html(-title => 'Test'),
CHI::h1("Inhalt von $url")', '<TT>';
Wie gesagt, die üblichen Fehler (keine Rechte, falsches Dateiformat, etc.) scheiden aus, da das Script läuft, wenn den open-Befehl entferne. Auch die Datei "test.dat" existiert im selben Verzeichnis wie das Test-Script.
Das muss nichts heißen. Nicht jeder server ist so eingestellt, dass der Standardpfad das gleiche wie der Pfad des Skriptes ist.
Du kannst es dir ausgeben lassen:
use Cwd;
print cwd();
Übrigens $url klingt für mich, als ob du versuchst eine entfernt liegende Resource zu öffnen, das geht aber nicht mit dem open Befehl. Aber vermutlich weißt du das.
Struppi.
Danke für alle Tipps! Es ist einiges dabei, was ich in Zukunft beachten werde. Das Problem selbst hat sich inzwischen übrigens einfach von alleine gelöst; inzwischen geht alles wieder, ganz ohne mein Zutun :).