<div dir="ltr">Legal, se tiver dúvida de pq fiz assim ou assado, é só perguntar !<div><br></div><div>Solli Honorio</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">Em 26 de março de 2013 17:04, Marcio - Google <span dir="ltr"><<a href="mailto:marciorp@gmail.com" target="_blank">marciorp@gmail.com</a>></span> escreveu:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Solli,<br>
<br>
   Muito obrigado pelos exemplos. Estou lendo o artigo também.<br>
<br>
[...]´s<br>
<br>
Marcio<br>
<br>
Em 26 de março de 2013 09:07, Solli Honorio <<a href="mailto:shonorio@gmail.com">shonorio@gmail.com</a>> escreveu:<br>
<div class="HOEnZb"><div class="h5"><br>
> Marcio, a minha estrutura básica de script está abaixo mas recomendo<br>
> fortemente que você leia <a href="http://sao-paulo.pm.org/equinocio/2011/set/8" target="_blank">http://sao-paulo.pm.org/equinocio/2011/set/8</a><br>
><br>
> Quando eu preciso utilizar fork, eu estou utilizando o<br>
> Parallel::ForkManager, pois a minha vida ficou muito mais simples.<br>
><br>
> <code><br>
> #!/usr/bin/env perl<br>
> use common::sense;<br>
> use Unix::PID;<br>
> use Getopt::Long;<br>
> use Log::Log4perl;<br>
> use Config::Simple;<br>
><br>
> use sigtrap 'handler' => \&finish_process, 'INT', 'ABRT', 'QUIT', 'TERM';<br>
><br>
> binmode STDOUT, ":utf8";<br>
><br>
> my $VERSION = '1.00';<br>
> my ($logger, %CONFIG, %CHECKER);<br>
><br>
> $CONFIG{NUM_PROCESS}  = 10;   # Numero máximo de processo<br>
> $CONFIG{TIMEOUT}      = 300;  # timeout nos processos<br>
> $CONFIG{stats}{start} = time();<br>
><br>
> Getopt::Long::Configure('bundling');<br>
> GetOptions(<br>
>     "v|version" => sub { show_version() } ,<br>
>     "h|help"    => sub { help() } ,<br>
>     "f|file=s"  => \$CONFIG{file} ,<br>
> );<br>
><br>
> check_data();<br>
> init_script();<br>
><br>
> # responsável por finalizar o script de maneira correta<br>
> sub finish_process {<br>
>     $logger->info("Encerrando o processamento");<br>
><br>
>     unlink $CONFIG{cfg}->{pid_file};<br>
><br>
>     exit 0;<br>
> }<br>
><br>
> # responsável por verificar se todos os dados fornecido<br>
> # via linha de comando estão corretas<br>
> sub check_data {<br>
>     for my $key ( keys %CHECKER ) {<br>
>         if (! $CHECKER{$key}{where}->() ) {<br>
>             say $CHECKER{$key}{documentation};<br>
>         }<br>
>     }<br>
> }<br>
><br>
> # carrega o arquivo de configuração, inicia o log e<br>
> # confirma se já não está em execução.<br>
> sub init_script{<br>
>     Config::Simple->import_from( $CONFIG{file}, \%{$CONFIG{cfg}} );<br>
>     my $log_conf = qq(<br>
>         log4perl.rootLogger                = DEBUG, LOG1<br>
>         log4perl.appender.LOG1             = Log::Dispatch::FileRotate<br>
>         log4perl.appender.LOG1.filename    = $CONFIG{cfg}->{log_file}<br>
>         log4perl.appender.LOG1.mode        = append<br>
>         log4perl.appender.Log1.utf8        = 1<br>
>         log4perl.appender.LOG1.autoflush   = 1<br>
>         log4perl.appender.LOG1.max         = 31<br>
>         <a href="http://log4perl.appender.LOG1.TZ" target="_blank">log4perl.appender.LOG1.TZ</a>          = America/Sao_Paulo<br>
>         log4perl.appender.LOG1.DatePattern = yyyy-MM-dd<br>
>         log4perl.appender.LOG1.layout      =<br>
> Log::Log4perl::Layout::PatternLayout<br>
>         log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n<br>
>     );<br>
><br>
>     Log::Log4perl::init(\$log_conf);<br>
>     $logger = Log::Log4perl::get_logger();<br>
><br>
>     Unix::PID->new()->pid_file( $CONFIG{cfg}->{pid_file} )<br>
>                 or die "Processo já em execução\n";<br>
><br>
>     return 1;<br>
> }<br>
><br>
> # carrega o hash checker com os parametros de verificação<br>
> BEGIN {<br>
>     %CHECKER = (<br>
>         file => {<br>
>             documentation => 'Informa a localização do arquivo de<br>
> configuração',<br>
>             required      => 1,<br>
>             where         => sub { return 1 if -e $CONFIG{file} },<br>
>         },<br>
>     );<br>
> }<br>
><br>
> # só para garantir (ou não) a remoção do arquivo de pid<br>
> END {<br>
>    unlink $CONFIG{cfg}->{pid_file};<br>
> }<br>
><br>
> </code><br>
><br>
><br>
> Em 25 de março de 2013 16:05, Marcio - Google <<a href="mailto:marciorp@gmail.com">marciorp@gmail.com</a>>escreveu:<br>
><br>
>> Mestres,<br>
>><br>
>>    Obrigado por todas as dicas, foram muito valiosas.<br>
>>    Eu utilizo Perl para rotinas de sysadmin e implementações para<br>
>> Asterisk (AMI e AGI).<br>
>><br>
>>    Hernan, nesse Equinócio acho que não consigo escrever um artigo ainda.<br>
>> Estou muito fraco, o conteúdo não séria de interesse de ninguém além de mim<br>
>> ... rsrs ... mas já estou fazendo anotações para escrever um para o<br>
>> próximo, só não sei se vai ser de interesse da comunidade. Será sobre Perl<br>
>> voltado para Asterisk.<br>
>><br>
>>    Voltando ao assunto principal, para mim, pelo menos agora, a melhor<br>
>> opção para reutilizar o código é o que o Ricardo mostrou. Acho que é muita<br>
>> pouca coisa para criar um módulo, além do que não domino nem o básico do<br>
>> básico para querer me aventurar por áreas que podem me trazer mais dor de<br>
>> cabeça.<br>
>><br>
>>    Sobre o retorno, o que o Solli colocou sobre passar uma referência<br>
>> para retornar as informações e no retorno mesmo voltar só se concluiu ou<br>
>> não me agradou bastante, pois já utilizo essa técnica em C#, mais em Perl<br>
>> não sabia como fazer.<br>
>>    Na questão de avisar o consumidor sobre eventuais erros, no meu caso é<br>
>> só log mesmo, pois o que faço é tudo rotina de servidor. Mais<br>
>> isso suscitou outra dúvida, que colocarei no final.<br>
>><br>
>>    Também vou adotar o padrão que o Danie sugeriu para nomenclaturas<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa
</div>