Pergunta

Tive alguns problemas para bifurcar processos de um script Perl CGI ao executar no Windows.O principal problema parece ser que o 'fork' é emulado quando executado no Windows e na verdade não parece criar um novo processo (apenas outro thread no atual).Isso significa que os servidores web (como o IIS) que estão aguardando a conclusão do processo continuam aguardando até que o processo em 'segundo plano' termine.

Existe uma maneira de separar um processo em segundo plano de um script CGI no Windows?Melhor ainda, existe uma única função que eu possa chamar que fará isso de maneira multiplataforma?

(E só para tornar a vida ainda mais difícil, eu realmente gostaria de uma boa maneira de redirecionar a saída dos processos bifurcados para um arquivo ao mesmo tempo).

Foi útil?

Solução

Se você quiser fazer isso de forma independente de plataforma, Proc::Fundo é provavelmente a melhor maneira.

Outras dicas

Usar Win32::Process->Criar com parâmetro DETACHED_PROCESS

perlfork:

O PERL fornece uma palavra -chave Fork () que corresponde à chamada do sistema UNIX com o mesmo nome.Na maioria das plataformas do tipo UNIX, onde está disponível a chamada do sistema Fork (), o Fork () de Perl simplesmente chama.

Em algumas plataformas, como o Windows, onde a chamada do sistema Fork () não está disponível, o Perl pode ser criado para imitar o Fork () no nível do intérprete.Embora a emulação tenha sido projetada para ser o mais compatível possível com o garfo real () no nível do programa PERL, existem certas diferenças importantes que decorrem do fato de que todo o pseudo -criança `` processos '' criado dessa maneira ao vivo ao vivo No mesmo processo real, no que diz respeito ao sistema operacional.

Encontrei problemas reais com fork() no Windows, especialmente ao lidar com objetos Win32 em Perl.Portanto, se for específico do Windows, eu realmente recomendo que você dê uma olhada na biblioteca Thread dentro do Perl.

Eu uso isso com bons resultados, aceitando mais de uma conexão por vez em sites que usam IIS e, em seguida, usando ainda mais threads para executar scripts diferentes de uma só vez.

Esta pergunta é muito antiga e a resposta aceita está correta.No entanto, acabei de fazer isso funcionar e resolvi adicionar mais alguns detalhes sobre como fazer isso para quem precisar.

O código a seguir existe em um script CGI perl muito grande.Essa sub-rotina específica cria tickets em vários sistemas de tickets e, em seguida, usa os números dos tickets retornados para fazer uma chamada automatizada por meio dos serviços da Twilio.A chamada demora um pouco e eu não queria que os usuários do CGI tivessem que esperar até que a chamada terminasse para ver o resultado da solicitação.Para tanto, fiz o seguinte:

  (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)

Tenho certeza de que o número aleatório gerado e anexado ao pid é um exagero, mas não tenho interesse em criar problemas que sejam facilmente evitados.Espero que isso ajude alguém que queira fazer o mesmo tipo de coisa.Lembre-se de adicionar use Proc::Daemon na parte superior do seu script, espelhe o código e altere os caminhos e nomes do seu programa, e você estará pronto para prosseguir.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top