Pregunta

He tenido algunos problemas para bifurcar procesos desde un script Perl CGI cuando lo ejecutaba en Windows.El problema principal parece ser que 'fork' se emula cuando se ejecuta en Windows y en realidad no parece crear un nuevo proceso (solo otro hilo en el actual).Esto significa que los servidores web (como IIS) que están esperando a que finalice el proceso continúan esperando hasta que finalice el proceso en segundo plano.

¿Existe alguna forma de separar un proceso en segundo plano de un script CGI en Windows?Aún mejor, ¿hay alguna función única a la que pueda llamar que haga esto de forma multiplataforma?

(Y solo para hacer la vida aún más difícil, realmente me gustaría una buena manera de redirigir la salida de los procesos bifurcados a un archivo al mismo tiempo).

¿Fue útil?

Solución

Si desea hacer esto de forma independiente de la plataforma, Proceso::Fondo es probablemente la mejor manera.

Otros consejos

Usar Win32::Proceso->Crear con el parámetro DETACHED_PROCESS

horquilla:

Perl proporciona una palabra clave Fork () que corresponde a la llamada del sistema Unix del mismo nombre.En la mayoría de las plataformas similares a unix donde la llamada del sistema Fork () está disponible, Perl's Fork () simplemente lo llama.

En algunas plataformas como Windows donde la llamada del sistema Fork () no está disponible, Perl se puede construir para emular la horquilla () a nivel de intérprete.Si bien la emulación está diseñada para ser lo más compatible posible con la bifurcación real () en el nivel del programa Perl, hay ciertas diferencias importantes que se derivan del hecho de que todos los `` `` procesos '' '' '' se crean de esta manera en vivo En el mismo proceso real en lo que respecta al sistema operativo.

He encontrado problemas reales con fork() en Windows, especialmente cuando trato con objetos Win32 en Perl.Por lo tanto, si va a ser específico de Windows, realmente le recomiendo que consulte la biblioteca Thread dentro de Perl.

Utilizo esto con buenos resultados al aceptar más de una conexión a la vez en sitios web que usan IIS y luego usar aún más subprocesos para ejecutar diferentes scripts todos a la vez.

Esta pregunta es muy antigua y la respuesta aceptada es correcta.Sin embargo, acabo de hacer que esto funcione y pensé en agregar más detalles sobre cómo lograrlo para cualquiera que lo necesite.

El siguiente código existe en un script CGI en Perl de gran tamaño.Esta subrutina particular crea tickets en múltiples sistemas de emisión de tickets y luego utiliza los números de ticket devueltos para realizar una llamada automatizada a través de los servicios de Twilio.La llamada lleva un tiempo y no quería que los usuarios de CGI tuvieran que esperar hasta que finalizara la llamada para ver el resultado de su solicitud.Para ello, hice lo siguiente:

  (All the CGI code that is standard stuff.  Calls the subroutine needed, and then)

  my $randnum = int(rand(100000));
  my $callcmd = $progdir_path . "/aoff-caller.pl --uniqueid $uuid --region $region --ticketid $ticketid";
  my $daemon = Proc::Daemon->new(
    work_dir     => $progdir_path,
    child_STDOUT => $tmpdir_path . '/stdout.txt',
    child_STDERR => $tmpdir_path . '/stderr.txt',
    pid_file     => $tmpdir_path . '/' . $randnum . '-pid.txt',
    exec_command => $callcmd,
  );
  my $pid = $daemon->Init();

  exit 0;

  (kill CGI at the appropriate place)

Estoy seguro de que el número aleatorio generado y adjunto al pid es excesivo, pero no tengo ningún interés en crear problemas que se puedan evitar fácilmente.Esperemos que esto ayude a alguien que quiera hacer el mismo tipo de cosas.Recuerda agregar use Proc::Daemon en la parte superior de su secuencia de comandos, refleje el código y modifique las rutas y los nombres de su programa, y ​​debería estar listo para comenzar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top