Página 1 de 1

Dejar un cgi funcionando permanentemente

NotaPublicado: 2009-10-07 12:38 @568
por BigBear
Hola.

Tengo una duda porque acabo de hacer un programa que me gustaría que esté siempre activo.

Lo que quiero es que este programa en CGI esté siempre activo; por eso me hice una cuenta en Tripod Lycos.

Pero tengo una duda básica ¿Si pongo index.cgi estaría siempre activo mi programa sin necesidad de alguna visita?

Re: Dejar un cgi funcionando permanentemente

NotaPublicado: 2009-10-07 14:45 @656
por explorer
Sí que puedes dejar un CGI siempre funcionando... pero... en la mayoría de los alojamientos, los procesos arrancados por el servidor web tienen un límite de tiempo de CPU, un máximo de memoria ocupada y un tiempo máximo de respuesta del programa al servidor Web.

Esto último se refiere a que es el servidor web el que arranca el CGI, después de recibir una petición del usuario. Si el CGI no termina de responder, el servidor web cortará la transmisión. Esto se configura en la directiva TimeOut en el Apache.

Lo que sí puedes hacer es devolver al servidor web la página que quieres mostrar, y luego entrar en el bucle de espera.

Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use CGI qw/:standard/;
  4.  
  5. print
  6.     header,
  7.     start_html("Pruebas..."),
  8.     p("Fin..."),
  9.     end_html,
  10.     ;
  11.  
  12. #close STDIN;
  13. close STDOUT;
  14. #close STDERR;
  15.  
  16. while (1) {
  17.     # Bucle sin fin
  18. }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


El comentar la línea del STDIN es importante: si cerramos la entrada estándar, el servidor web matará a nuestro proceso. Pero si cerramos STDOUT le estamos diciendo que ya no le enviamos más información. El servidor web terminará la conexión con el cliente, pero aún seguirá haciendo funcionar el programa.

El problema... que un programa Perl sin fin es extraordinariamente peligroso...

Solo es necesario meter esta línea en el bucle anterior, para colgar la máquina, comiéndose todos los recursos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $j .= 'x' x 1_000_000;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(reservamos un megabyte en cada vuelta).

O no: si el servidor web ha sido arrancado con algún tipo de limitación de consumo de recursos, matará a tu proceso.

Puedes probar a ver qué te sale... pero atención: recuerda que cada petición del CGI es una nueva instancia del programa, que se sumará a las anteriores. Debes incluir en el CGI una condición de parada, o te arriesgas a inundar el servidor de procesos corriendo a la vez.

Quizás sea más fácil ayudarte si nos dices para qué necesitas tener un programa funcionando constantemente (al menos, por encima).

Re: Dejar un cgi funcionando permanentemente

NotaPublicado: 2009-10-07 15:42 @695
por BigBear
Gracias por tu explicación.

Se que suena mal pero pensaba en este pequeño proyecto para un bot irc que registre lo que pase pero nada ilegal.

¿Algo que agregar?

Re: Dejar un cgi funcionando permanentemente

NotaPublicado: 2009-10-07 16:19 @721
por explorer
Pero si el servidor IRC es visible desde Internet, puedes dejar funcionar ese programa en cualquier otro ordenador conectado a Internet. Por ejemplo, tu propio ordenador.

No me suena que a los proveedores de servicios les guste tener un programa funcionando constantemente.

Pero por probar...

Puedes usar la facilidad nph de CGI.pm para que la conexión no termine nunca y así el CGI puede enviar información al cliente.

Actualización: Sí que hay una forma de colocar un programa funcionando constantemente en un servidor de un proveedor de Internet: contratando un servidor físico. Así podrás instalar lo que quieras. Lo malo es que es un poco caro...