2009-11-30 20 views
5

Estoy seguro de que alguien podría responder esto rápidamente, pero soy nuevo en Perl ...¿Por qué mi CGI de Perl se queja de "encabezados de final prematuro de scripts"?

Estoy tratando de modificar demarc (una herramienta de supervisión de red simple) para hacer una llamada al sistema a un simple guión. El script en sí no hace nada, solo intento hacer una 'prueba de concepto' porque sigo recibiendo un error interno del servidor. Los permisos para el script se han establecido en 777. Cuando comento la llamada al sistema(), todo está bien. Eso me hace sospechar que es la llamada al sistema() donde ocurre el error. También intenté con exec(), pero eso tampoco funcionó. El error no podría estar en el script en sí, ya que solo hay una "prueba" de eco en él.

¿He perdido algún permiso o hay alguna otra forma de hacerlo funcionar? Cualquier consejo sería apreciado.

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

esto se le llama en algún lugar de archivo de la siguiente manera:

} 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"; 

registro de errores: [Mon Nov 30 de 2009 14:58:22] [ error] [cliente 127.0.0.1] final prematuro de los encabezados del script: demarc, referer: http://localhost/dm/demarc?td=show_events&limit=60&sid=35

+1

ayudarnos a ayudarle por decirnos lo que los argumentos a su sistema() o llamadas exec() son. –

+0

muéstranos un código. –

+0

Modifiqué mi publicación para agregar código de muestra ... – EDJ

Respuesta

0

Parece que desea capturar la salida de test.pl. El uso de system o exec no lo logrará (y con exec, su secuencia de comandos principal ya no se ejecutará cuando se ejecute test.pl).

En su lugar, usted podría utilizar acentos abiertos:

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

Bueno ... realmente no en este momento, pero sí, querré capturarlo en el futuro. En este momento, solo quiero que supere el error interno del servidor ... Probaré el revés en este momento ... – EDJ

+0

Esto realmente funciona, lo usaré como último recurso. – EDJ

+0

Si esto funciona, y el sistema no, ¿es posible que en algún lugar tenga una ruta incorrecta? – Geo

2

Es posible que desee system, no exec:

La función exec ejecuta un sistema sistema de mando y su uso nunca se returns-- en lugar de ejecutivo si lo quiere devolución.

consulte la documentación de exec.

+0

Probé el sistema() primero antes de probar exec(), pero tampoco funcionó ... :) – EDJ

+0

'system' al menos no funcionaría * de manera diferente * de una manera que iluminaría más el problema. 'exec' es definitivamente incorrecto. – hobbs

+0

@hobss: Ya veo. Gracias por el consejo. – EDJ

1

Consulte 500 Server Error en la lista de Preguntas frecuentes de Perl.

Se ha asegurado de que el script se ejecute desde la línea de comandos, ¿verdad?

+0

Sí ... Probé esto primero ... – EDJ

2

Bueno, creo que lo primero que tiene que hacer es comprobar el registro del servidor web, por lo general tiene una razón para lanzar un error interno del servidor.

+0

Lo revisé y lo publiqué como parte de mi pregunta. :) – EDJ

0

Lo mejor es que intentes con una versión más simple de lo que intentas hacer.

Prueba esto:

  • crear algo así como test2.pl el que hace algo más simple.
  • Ejecute un script simplificado.

    #!/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; 
    

Ahora,

  1. Si $rc es 0. Luego funcionó para ejecutar el script de esa manera. De lo contrario, $OS_ERROR debería decírselo.
  2. Si todo esto funciona, entonces podría tratar de ejecutar el script original y ver si eso funciona bien.
  3. Si eso funciona, entonces podría ser el estado del programa en el momento en que se lo llama.

Pero, como otras personas han señalado, a menos que esté todo hecho de ejecutar el script, exec -ing de la escritura no es lo que quiere hacer, incluso si se tratara de un programa. Eso solo cargaría el programa sobre el espacio utilizado por el script.

Utilizando los qx o invertidas (`) permitirá a la línea de comandos para ser interpretada por el shell que se encargará de los shebangs (#!) en la secuencia de comandos Perl y devolver la salida de la secuencia de comandos.

-2

Siempre he sido un fan de la utilización qx para mi sistema de llamadas:

my @array = qx(ls -1); 

sistema devuelve una cadena que luego tiene que ser analizada, por qx devuelve una matriz, y si usted sabe la línea 4 tiene la información que necesita, puede ir allí y tomarla.

+0

'system' no devuelve una cadena, devuelve un valor de retorno entero y no captura la salida del programa en absoluto. 'qx' devuelve una lista de líneas * o * una cadena según el contexto. – hobbs

+0

¿Puedes señalar alguna documentación que enumere qx ​​dando como resultado una cadena/matriz según el contexto? Nunca he visto ese comportamiento – MikeEL

7

"Fin prematuro de encabezados de scripts" no es un mensaje de error terriblemente útil por sí mismo. Podría ser causada por cualquiera de un número de cosas, tales como:

  • no ser ejecutable (problema de permisos)
  • no compilación (error de sintaxis, problema de dependencia, etc.)
  • terminando prematuramente durante regulares
  • ejecución
  • producir algo distinto de cabeceras HTTP apropiadas como primera salida de la secuencia de comandos

Sin embargo, en este caso, si hemos de tomar su script de ejemplo, literalmente (print "TEST"), y usted muestra esto antes de sus encabezados HTTP, entonces no está produciendo encabezados HTTP primero, entonces es el último. El servidor web espera encabezados, no "PRUEBA".

Si ese no es el caso, necesitamos ver más del contexto de su código para saber qué pudo haber pasado. Podría ser un problema de permisos ejecutando test.pl, por ejemplo.

1

No es el CGI de Perl el que se queja, sino Apache. Apache dice que su script CGI no está generando los encabezados necesarios, así que eso es lo primero que necesita lograr.

Siempre trato de hacer CGI con una secuencia de comandos de printenv primero, p.

#!/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; 

Una vez que eso funcione, intente con otra cosa.

2

Una forma de encontrar la causa de lo prematuro es hacer que los errores vayan al navegador.Sólo tienes que enviar la cabecera de tipo de contenido al principio de la aplicación, por ejemplo como este, en algún lugar en la parte superior de su código:

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

Ahora usted debería ser capaz de ver el error en el navegador.

0

[cliente 127.0.0.1] Fin prematuro de los jefes de la escritura:

tiene que declarar en su archivo pl (en caso de que desea ejecutar en el navegador) la cabecera de tipo de contenido. Aquí está un ejemplo:

#!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>"; 

### 

verificación de la línea que dice: print "Content-type: text/html \ n \ n"; < - esta línea es muy importante

grettings

Cuestiones relacionadas