(AJUDA) Ler novos arquivos texto ou incremento e fila - Perl - Fórum Script Brasil
Asked by gabrielanjos,
gabrielanjos 0
gabrielanjos
Boa tarde, preciso de uma ajuda com o Perl. Primeiramente vou explicar o cenário já existente, onde está minha preocupação e o que eu precisava.
Eu estou realizando a integração entre dois sistemas, o primeiro sistema me permite executar um comando no shell do linux passando algunas variáveis, sendo assim, eu estou fazendo esse sistema em determinadas condições executar o script em perl que estou criando passando alguns parametros. Ex. "perl /caminho/do/script/meuScript.pl arg1 arg2 arg3 arg4"
Dentro desse arquivo eu faço algumas validações e por fim eu crio um um JSON e envio via WebService HTTP:REST para o segundo sistema, este por fim processa o solicitado.
Porém, pode ocorre do sistema 2 por exemplo ficar indisponível, e se ele ficar, eu perco o que estava tentando ser inserido nele. Dessa forma eu preciso criar algum tipo de fila, porém, não posso fazer isso em memória, pois sobrecarregaria o servidor. Dessa forma, algumas pessoas me indicaram que eu fizesse o meu script alimentar ou criar arquivos de texto para cada mensagem a ser enviada, e que eu fizesse um segundo script que ficasse rodando como Daemon (não sei como fazer isso) e ficasse vendo se foi criado novos arquivos ou incrementado algum, e então ele processaria esses arquivos, se houve sucesso na inserção do segundo sistema, ele aparia o arquivo ou a linha do arquivo, caso desse erro, ele ficaria tentando até conseguir.
Alguém experiente em desenvolvimento e em perl poderia me ajudar com essa? Obrigado desde já. Desculpa pelo imenso texto, tentei ser o mais claro possível para o meu problema.
Location:/usr/bin/
Gabriel, o Perl possui n soluções para resolver o teu problema, mas você está buscando uma solução com um certo nível de complexidade, logo precisará de algum pouco conhecimento da linguagem.
Eu te recomendaria utilizar o módulo Daemon::Generic, um framework para criação de daemons que já implementa comandos start/stop/version/restart/reload e etc, controle de PID, mensagem de help e etc. Basta criar um módulo com métodos "gd_preconfig()", "gd_run()", e etc. A documentação no CPAN será sua amiga!
Na execução do daemon, você precisará ficar listando o diretório sem parar, certo? Para estas tarefas eu gosto muito de utilizar o timer() do AnyEvent, um framework de event loop que você ainda vai ouvir falar muito ao mexer com Perl.
Para o log, você pode utilizar o Log::Log4perl no modo easy para implementar as principais funções de debug(), error(), etc.
Olha, são duas e meia da manhã e estou suave, tomando um café. Então vou criar um esqueleto para que você possa entender melhor como eu o faria:
package MeuDaemon;
use warnings q(all);
use FindBin qw($RealBin $Script);
progname => $Script,
pidfile => "$RealBin/$Script.pid"
sub gd_preconfig {
level   => $DEBUG,
file    => "STDOUT",
#file   => "$RealBin/$Script.log",
sub gd_run {
my $w  = AnyEvent->timer(
after    => 0.0,
interval => 1.0,
INFO "Buscando arquivos no diretorio...";
my @files = glob("/home/fvox/filesToProc/*");
DEBUG "Processando ${file}...";
INFO "Fim do processo!";
O script já funciona em loop, buscando arquivos no diretório a cada 1 segundo. O AnyEvent cai como uma luva para se trabalhar com I/O non blocking: isto implica que o processo, enquanto ficar em espera, não consumirá 100% dos clocks da CPU. =p
Agora cabe a você personalizar e otimizar o teu daemon, como por exemplo, dividindo a lista de arquivos encontrados numa queue de forks.
Claro que o CPAN te oferece zilhões de opções de módulos para fazer essas tarefas que você precisa e nos exemplos que criei foram utilizados módulos do meu gosto particular. =p