PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler im Script :-(



Escorte
23-04-2001, 10:53
Hallo zusammen,

ich habe ein Problem mit einem Perlscript, das eine PS Datei in ein PDF umwandeln soll und mehr...



#!/usr/bin/perl

binmode STDIN;
read STDIN, $Daten, $ENV{'CONTENT_LENGTH'};

@Teile = split /-----------------------------.{9}/, $Daten;
@Datei = split /\n/, $Teile[1], 5;
while ($Datei[1] =~ /\\/) { $Datei[1] =~ s/^.*\\//; }
$Datei[1] =~ s/"//;
chop $Datei[1];
chop $Datei[4]; chop $Datei[4];

open DATEI, ">/tmp/$Datei[1]";
binmode DATEI;
print DATEI $Datei[4];
close DATEI;

# Ab hier wirds ernst...

print "content-type: text/html\n\nKonvertierung erfolgreich! ";
system ("ps2pdf /tmp/$Datei[1] /home/.../upload/$Datei[1].pdf");
wait;
print "Bitte abspeichern: <a href=http://......../$Datei[1].pdf>$Datei[1].pdf</a>";


Erläuterung:
Per HTML-Formular wird die Datei auf den Server übertragen und gespeichert, DAS GEHT WUNDERBAR!! Nun rufe ich den System-Befehl auf, DER GEHT AUCH!Alles rosig! Nur wenn ich jetzt in der Praxis eine PS Datei übermittele und die Umwandeln will, dann dauert das schon so seine 8-10 Sekunden. Der Browser kommt wohl nicht damit klar und gibt einen "Fehler 500 Internal Server Error" selbst das wait; bringt da nix. Das dolle ist ja: DAS PDF WIRD ERSTELLT! Ich kann es dann auch runterladen. Ich hatte es aber auch schon mal das der Vorgang ok verläuft, dann kommt nämlich die Seite "Erfolg... " mit dem Link zum Downloaden.

Hilfe, helft mir! :)

MfG,
Escorte

lolli
23-04-2001, 12:01
hallo escorte,
was steht denn im /var/log/httpd/error.log (kann auch anders heissen)


olli

Escorte
23-04-2001, 12:54
Hmmmm....

In der Log-Datei steht nix...
In der access_log ist der Zugriff registriert, aber nicht in der error_log...

Es kommt immer noch die Meldung:
"Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request."

Aber in der Log steht zum verrecken nichts :(

Hat nicht jemand ne Loesung, welchge den Fehler einfach ignoriert? Die Datei wird ja zu 100% in Ordnung erstellt. Aber der Rest des Scriptes wird nicht gezeigt.

Was koennte ich denn z.B. mit dem "die" command machen? Der koennte den Fehler doch abfangen?

Eine Idee?

MfG,
Escorte

[ 23. April 2001: Beitrag editiert von: Escorte ]

jgbauman
23-04-2001, 14:58
Hab zwar keine Ahnung von Perl, aber system benoetigt eigentlich kein wait, da es selbest auf den Kindprozess warted. Und ein wait ohne laufenden Kindprozess sollte eine Fehlermeldung geben.
Also einfach wait; weglassen und ausprobieren.

Vielleicht hilfts ;-)

lolli
23-04-2001, 18:45
hi escorte,
das du bei einem 500er fehler keinen eintrag findest, ist eigentlich sehr unwahrscheinlich. vielleicht schreibt apache den in eine andere datei. welches OS und apache nutzt du denn?
gehts eigentlich ohne den system-befehl?

olli

Escorte
24-04-2001, 07:09
Interessant!

Die Version ist: Apache/1.3.12
Distri: RedHat 6.2

Folgendes habe ich heute Morgen aus der error_log entnommen. 5.10 Uhr springt der Server an, ich weiss, das ist untypisch, aber ich habe hier keinen permanent-Strom ;)

<BLOCKQUOTE><font size="1" face="Arial,Helvetica,Geneva">Zitat:</font><HR>
[Tue Apr 24 05:11:09 2001] [notice] Apache/1.3.12 (Unix) (Red Hat/Linux) PHP/3.0.15 mod_perl/1.21 configured -- resuming normal operations
Global symbol "$Daten" requires explicit package name at /home/httpd/cgi-bin/konvert.pl line 6.
Global symbol "@Teile" requires explicit package name at /home/httpd/cgi-bin/konvert.pl line 8.
Global symbol "@Datei" requires explicit package name at /home/httpd/cgi-bin/konvert.pl line 9.
Execution of /home/httpd/cgi-bin/konvert.pl aborted due to compilation errors.
[Tue Apr 24 07:06:26 2001] [error] [client 10.0.9.183] Premature end of script headers: /home/httpd/cgi-bin/konvert.pl
[/quote]

Was sollen denn die ganzen Fehlermeldungen? Ist das Script falsch? Anscheinend hat es was damit zu tun...

Escorte.

lolli
24-04-2001, 08:39
versuche mal die klammern mit anzugeben!!
read (STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
@Teile = split (/-----------------------------.{9}/, $Daten);
@Datei = split (/\n/, $Teile[1], 5);

[Tue Apr 24 07:06:26 2001] [error] [client 10.0.9.183] Premature end of script headers: /home/httpd/cgi-bin/konvert.pl

dieser fehler tritt auf, wenn der html-header nicht richtig gesendet wurde. es ist möglich, das die anderen fehlermeldungen vor den eigentlichen header an den browser gesandt wurden. das dann der nicht weiss, was er damit anstellen soll (ist schliesslich kein html-header), ist eigentlich klar.
versuchen kannst du auch mal mit einem grossen C (Content-ty....). ich weiss nicht genau, ob groos- un dkleinschreibung egal egal ist.

olli

lolli
24-04-2001, 12:22
was meinst du mit überspringen?

olli

Escorte
24-04-2001, 13:36
Jaaa, damit meine ich folgendes:
Wenn der User mit dem "Browse"-Button eine Datei ausgesucht hat, dann drueckt er auf "Submit" und das Script wird gestartet. Danach kommt die Fehler500-Seite. Kann man die nicht irgendwie hinterruecks umgehen oder ueberspringen, das meinte ich.

Escorte
24-04-2001, 23:56
Hallo olli (und alle anderen Leser),

Die Fehler aus der error_log treten nicht mehr auf, die Klammern haben geholfen. Doch der Fehler 500 kommt immer noch. Ich habe auch aus dem c ein C gemacht, ist anscheinend Jacke wie Hose.

Die error_log wird nicht modifiziert, dafuer aber die access_log:

<BLOCKQUOTE><font size="1" face="Arial,Helvetica,Geneva">Zitat:</font><HR>[24/Apr/2001:11:50:32 +0200] "POST /cgi-bin/convert.pl HTTP/1.1" 500 623[/quote]

Hat denn jemand ne Idee, wie ich den Fehler quasi "ueberspringen" kann?

Dass ich z.B. verhindern kann, dass der User auf die folgende Seite kommt, denn die ist bekanntlich ja falsch :)

Danke jedenfalls.
Escorte

Escorte
25-04-2001, 09:45
Hallo,

kann denn hier niemand Exception-Handling mit Perl?

Wuerde es was bringen?

MfG,
Escorte.

rbla
25-04-2001, 12:16
ich würde mal die reihenfolge in deinem skript ändern
zuerst den http header
dann das datei handling mit ps2pdf aufruf und danach die ausgabe (mit überprüfung des exit status des system() befehls)

außerdem würde ich sowas wie
open() or die "fehler beim erstellen"
machen

ach ja und teste das skript mit perl -wc

Escorte
26-04-2001, 07:28
JAAAAAA ES KLAPPT!!!!

JETZT GEHT ER!!!!!!!!

Ihr werdet nie drauf kommen. ps2pdf macht eine nette Ausgabe:

<BLOCKQUOTE><font size="1" face="Arial,Helvetica,Geneva">Zitat:</font><HR>
#ps2pdf /tmp/test2.prn /home/xxxx/public_html/upload/Datei.pdf [ENTER]
%%[ Page: 1 ]%%
%%[ Page: 2 ]%%
%%[ LastPage ]%%
[/quote]

Und die Ausgabe von %%[ Page: 1 ]%% hat mir alles versaut! Ein ">/dev/null" im system-Aufruf hat hier wahre Wunder gewirkt!

Trotzdem 1000 Dank an alle die mich so gut unterstützt haben. :D :D :D

Viele Grüße,
Escorte