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í:
Using perl Syntax Highlighting
#!/usr/bin/perl
use CGI qw/:standard/;
print
header,
start_html("Pruebas..."),
p("Fin..."),
end_html,
;
#close STDIN;
close STDOUT;
#close STDERR;
while (1) {
# Bucle sin fin
}
Coloreado en 0.003 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:
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).