[Cascavel-pm] rodar processo em background sem navegador aberto

Eden Cardim edencardim em gmail.com
Sexta Agosto 29 16:47:02 PDT 2008


2008/8/29 Luciano Giordani Bassani <lgbassani em terra.com.br>:
> Eu uso Fork para fazer isso.
>
>
> Exemplo:
>
> $pid = fork();
> print "Fork failed: $!" unless defined $pid;
> if($pid)
>   {
>   # Aqui vai o código executado pelo "pai" e que mostra na tela do navegador
> que a página foi executada com sucesso
>   }
> else
>   {
>   close(STDOUT);
>   # Aqui vai o código que vai ficar rodando em background
>   }

Sua abordagem tem duas falhas graves:

1) perl -le -MLWP::UserAgent
-e'$ua=LWP::UserAgent->new;$ua->post($uri_que_dispara_o_fork) while 1'

2) Se o processo filho morrer por algum motivo, o usuário que
solicitou o processamento não vai perder o resultado que pediu e você
não tem como notificá-lo disso. Além disso, a única forma de
re-executar o processamento é pedir que o usuário interaja novamente
com a aplicação.

A forma correta de se executar processos de vida longa numa aplicação
web é utilizar uma fila de processamento. Invés de executar na hora,
você acrescenta um item na fila (que pode estar armazenada num
mecanismo de persistência qualquer, como um banco de dados), contendo
os parâmetros de execução, status, identificação do usuário que
solicitou, etc. Enquanto isso, no seu servidor, vai haver um daemon
que monitora a fila, executando os processos e esvaziando a fila a
medida que forem concluídos.

É bastante simples de implementar e existem soluções prontas no cpan
como o TheSchwartz

-- 
edenc.vox.com


Mais detalhes sobre a lista de discussão Cascavel-pm