2009-11-30 11 views
5

Jestem pewien, że ktoś mógłby odpowiedzieć na to bardzo szybko, ale jestem po prostu nowy w perl ...Dlaczego moje CGI Perl narzeka na "Przedwczesne zakończenie nagłówków skryptu"?

Próbuję zmodyfikować demarc (proste narzędzie do monitorowania sieci), aby wykonać wywołanie systemowe do prostego scenariusz. Sam skrypt nic nie robi, po prostu próbuję wykonać "proof-of-concept", ponieważ ciągle dostaję wewnętrzny błąd serwera. Uprawnienia do skryptu zostały ustawione na 777. Kiedy skomentuję wywołanie system(), wszystko jest w porządku. Więc to sprawia, że ​​podejrzewam, że to wywołanie system() tam, gdzie wystąpił błąd. Próbowałem również exec(), ale to też nie działało. Błąd nie może znajdować się w samym skrypcie, ponieważ zawiera tylko "test" echa.

Czy brakowało mi uprawnień lub czy istnieje inny sposób wykonania tej pracy? Każda rada byłaby doceniona.

sub generate_ticket { 
    my @args = ("$base_path/test.pl"); 
    exec(@args); 
} 

ten nazywany jest gdzieś w pliku tak:

} elsif ($FORM{'delete_type'}=~/generate/) { 
    my $message = &generate_ticket($delete_array_ref); 
    #&ack_events($delete_array_ref); 
    $events_deleted = (@$delete_array_ref); 
    &push_message("<FONT COLOR=red><B>Result: $message.</B></FONT>"); 
} 

test.pl:

#!/usr/bin/perl 
print "Test"; 

dziennika błędu: [Mon 30 listopada 14:58:22 2009] [ błąd] [klient 127.0.0.1] Przedwczesne zakończenie nagłówków skryptu: demarc, referer: http://localhost/dm/demarc?td=show_events&limit=60&sid=35

+1

Pomóż nam pomóc, informując nas, co argumenty do systemu() lub exec() wywołuje się. –

+0

pokaż nam kod. –

+0

Zmodyfikowałem mój wpis, aby dodać przykładowy kod ... – EDJ

Odpowiedz

0

Wygląda na to, że chcesz uchwycić wynik z test.pl. Użycie tego nie osiągnie tego celu (i przy exec, twój główny skrypt nie będzie działał przed uruchomieniem test.pl).

Zamiast tego można użyć backticks:

my $message = `$base_path/test.pl`; 
+0

Cóż ... nie bardzo teraz, ale tak, będę chciał uchwycić to w przyszłości. Teraz, po prostu chcę, żeby to przeszło przez wewnętrzny błąd serwera. Spróbuję backtick teraz .... – EDJ

+0

To faktycznie działa, użyję tego jako ostatecznego rozwiązania. – EDJ

+0

Jeśli to działa, a system nie, czy możliwe jest, że masz złą ścieżkę? – Geo

2

Prawdopodobnie chcesz system nie exec:

Funkcja exec wykonuje system dowodzenia i nigdy returns-- systemu użyty zamiast exec, jeśli chcesz go zwrócić do .

Zobacz dokumentację dla exec.

+0

Próbowałem system() najpierw, zanim spróbowałem exec(), ale to nie działało również ... :) – EDJ

+0

"System" przynajmniej nie pracowałby * inaczej * w sposób, który rzucił więcej światła na problem. "exec" jest definitywnie błędne. – hobbs

+0

@hobss: Rozumiem. Dzięki za wskazówkę. – EDJ

1

Wyświetl listę 500 Server Error na liście FAQ.

Upewniłeś się, że skrypt działa z wiersza poleceń, prawda?

+0

Tak ... Testowałem to pierwszy ... – EDJ

2

Cóż, domyślam się, że pierwszą rzeczą, którą musisz zrobić, to sprawdzić swój dziennik serwera sieciowego, zazwyczaj ma powód, aby rzucić wewnętrzny błąd serwera.

+0

Sprawdziłem to, wysłałem to jako część mojego pytania. :) – EDJ

0

Najlepiej wypróbuj prostszą wersję tego, co próbujesz zrobić.

Spróbuj tego:

  • Tworzenie czegoś podobnego test2.pl który robi coś prostszego.
  • Uruchom uproszczony skrypt.

    #!/bin/perl 
    use feature 'say'; 
    use strict; 
    use warnings; 
    use Data::Dumper; 
    use English qw<$OS_ERROR>; 
    
    my $rc = system("$base_path/test2.pl"); 
    say "\$rc=$rc"; 
    say $OS_ERROR; 
    

Teraz

  1. Jeśli $rc jest 0. Potem działało, aby wykonać skrypt w ten sposób. W przeciwnym razie powinien ci powiedzieć: $OS_ERROR.
  2. Jeśli to wszystko działa, to możesz spróbować uruchomić oryginalny skrypt i sprawdzić, czy to też działa.
  3. Jeśli to działa, może to być stan programu w momencie jego wywołania.

Ale, jak zauważyli inni, o ile nie skończysz, skrypt nie jest tym, co chcesz zrobić, nawet jeśli był to program. To po prostu załadowałoby program na przestrzeń używaną przez skrypt.

Użycie qx lub odsunięć (`) pozwoli na interpretację linii poleceń przez powłokę, która obsłuży shebang (#!) w skrypcie perla i zwróci wynik skryptu.

-2

Zawsze byłem fanem używając Qx dla mojego systemu wymaga: System

my @array = qx(ls -1); 

zwraca ciąg znaków, który następnie musi być analizowany przez qx zwraca tablicę, a jeśli znasz wiersz 4 ma informacje, których potrzebujesz, możesz po prostu tam pójść i wziąć to.

+0

'system' nie zwraca łańcucha, zwraca zwracaną liczbę całkowitą i nie przechwytuje w ogóle wyniku programu. 'qx' zwraca listę linii * lub * ciąg znaków w zależności od kontekstu. – hobbs

+0

Czy możesz wskazać na pewną dokumentację z listą ciągów/tablic wyjściowych qx w zależności od kontekstu? Nigdy nie widziałem takiego zachowania – MikeEL

7

"Przedwczesne zakończenie nagłówków skryptów" nie jest bardzo przydatnym komunikatem o błędzie. Może to być spowodowane przez jedną z wielu rzeczy, takich jak:

  • nie jest wykonywalny (Uprawnienia problem)
  • braku kompilacji (błąd składni, problemem uzależnienia, etc.)
  • kończącą przedwcześnie podczas regularnych wykonanie
  • produkujących coś innego niż właściwych nagłówków HTTP jako pierwsze wyjście skryptu za

jednak w tym przypadku, jeśli mamy przyjąć przykładowy skrypt dosłownie (print "TEST"), i wypisujesz to przed nagłówkami HTTP, a potem nie tworzysz nagłówków HTTP, więc jest to ostatni. Serwer sieciowy oczekuje nagłówków, a nie "TEST".

Jeśli tak nie jest, musimy zobaczyć więcej kontekstu kodu, aby dowiedzieć się, co mogło się stać. Może na przykład występować problem z uprawnieniami na przykład test.pl.

1

To nie jest CGI Perla, który narzeka, ale Apache. Apache mówi, że twój skrypt CGI nie wyprowadza wymaganych nagłówków, więc jest to pierwsza rzecz, którą musisz osiągnąć.

Zawsze najpierw wypróbuję CGI ze skryptem printenv, np.

#!/usr/bin/env perl 

use warnings; 
use strict; 

print "Content-type: text/plain\r\n\r\n"; 
print "$_ => $ENV{$_}\r\n" for sort keys %ENV; 

Kiedy to zadziała, spróbuj czegoś innego.

2

Jednym ze sposobów na znalezienie przyczyny przedwczesnego problemu jest spowodowanie błędów w przeglądarce.Po prostu trzeba wysłać nagłówek Content-Type na początku stosowania, na przykład jak ten, gdzieś na szczycie kodzie:

BEGIN { 
    print "Content-type: text/plain\n\n"; 
} 

Teraz powinieneś być w stanie zobaczyć błąd w przeglądarce.

0

[klient 127.0.0.1] Przedwczesny koniec nagłówków Scenariusz:

trzeba zadeklarować w pliku pl (w przypadku, gdy chcesz uruchomić w przeglądarce) nagłówek typu zawartości. Oto przykład:

#!c:/wamp/bin/perl/bin/perl.exe 

print "Content-type: text/html\n\n"; 
print "<html><head><title>Test</title></head>"; 
print "<body>"; 
print "Hello"; 
print "</body></html>"; 

### 

sprawdzenie linii jest napisane: print "Content-Type: text/html \ n \ n"; < - ta linia jest bardzo ważna

Grettings

Powiązane problemy