<div dir="ltr">Marcio, a minha estrutura básica de script está abaixo mas recomendo fortemente que você leia <a href="http://sao-paulo.pm.org/equinocio/2011/set/8">http://sao-paulo.pm.org/equinocio/2011/set/8</a> <div><br>

</div><div>Quando eu preciso utilizar fork, eu estou utilizando o Parallel::ForkManager, pois a minha vida ficou muito mais simples.<div style> </div><div style><code></div><div style><div><font face="courier new, monospace">#!/usr/bin/env perl</font></div>

<div><font face="courier new, monospace">use common::sense;</font></div><div><font face="courier new, monospace">use Unix::PID;<br></font></div><div><font face="courier new, monospace">use Getopt::Long;<br></font></div><div>

<font face="courier new, monospace">use Log::Log4perl;</font></div><div><font face="courier new, monospace">use Config::Simple;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">use sigtrap 'handler' => \&finish_process, 'INT', 'ABRT', 'QUIT', 'TERM';</font></div>

<div><font face="courier new, monospace"><br></font></div><div><span style="font-family:'courier new',monospace">binmode STDOUT, ":utf8";</span><br></div><div><font face="courier new, monospace"><br></font></div>

<div><font face="courier new, monospace">my $VERSION = '1.00';</font></div><div><font face="courier new, monospace">my ($logger, %CONFIG, %CHECKER);</font></div><div><font face="courier new, monospace"><br></font></div>

<div><font face="courier new, monospace">$CONFIG{NUM_PROCESS}  = 10;   # Numero máximo de processo</font></div><div><font face="courier new, monospace">$CONFIG{TIMEOUT}      = 300;  # timeout nos processos</font></div><div>

<font face="courier new, monospace">$CONFIG{stats}{start} = time();</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Getopt::Long::Configure('bundling');</font></div>

<div><font face="courier new, monospace">GetOptions(</font></div><div><font face="courier new, monospace">    "v|version" => sub { show_version() } ,</font></div><div><font face="courier new, monospace">    "h|help"    => sub { help() } ,</font></div>

<div><font face="courier new, monospace">    "f|file=s"  => \$CONFIG{file} ,</font></div><div><font face="courier new, monospace">);</font></div><div><font face="courier new, monospace"><br></font></div><div>

<font face="courier new, monospace">check_data();</font></div><div><font face="courier new, monospace">init_script();</font></div><div><font face="courier new, monospace"><br></font></div><div style><font face="courier new, monospace"># responsável por finalizar o script de maneira correta</font></div>

<div><div><font face="courier new, monospace">sub finish_process {</font></div><div><font face="courier new, monospace">    $logger->info("Encerrando o processamento");</font></div><div><font face="courier new, monospace"><br>

</font></div><div><font face="courier new, monospace">    unlink $CONFIG{cfg}->{pid_file};</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    exit 0;</font></div>

<div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div style><font face="courier new, monospace"># responsável por verificar se todos os dados fornecido</font></div>

<div style><font face="courier new, monospace"># via linha de comando estão corretas</font></div><div><font face="courier new, monospace">sub check_data {</font></div><div><font face="courier new, monospace">    for my $key ( keys %CHECKER ) {</font></div>

<div><font face="courier new, monospace">        if (! $CHECKER{$key}{where}->() ) {</font></div><div><font face="courier new, monospace">            say $CHECKER{$key}{documentation};</font></div><div><font face="courier new, monospace">        }</font></div>

<div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div style><font face="courier new, monospace"># carrega o arquivo de configuração, inicia o log e </font></div>

<div style><font face="courier new, monospace"># confirma se já não está em execução.</font></div><div><font face="courier new, monospace">sub </font><span style="font-family:'courier new',monospace">init_script</span><font face="courier new, monospace">{</font></div>

<div><font face="courier new, monospace">    Config::Simple->import_from( $CONFIG{file}, \%{$CONFIG{cfg}} );</font></div><div><font face="courier new, monospace">    my $log_conf = qq(</font></div><div><font face="courier new, monospace">        log4perl.rootLogger                = DEBUG, LOG1</font></div>

<div><font face="courier new, monospace">        log4perl.appender.LOG1             = Log::Dispatch::FileRotate</font></div><div><font face="courier new, monospace">        log4perl.appender.LOG1.filename    = $CONFIG{cfg}->{log_file}</font></div>

<div><font face="courier new, monospace">        log4perl.appender.LOG1.mode        = append</font></div><div><font face="courier new, monospace">        log4perl.appender.Log1.utf8        = 1</font></div><div><font face="courier new, monospace">        log4perl.appender.LOG1.autoflush   = 1</font></div>

<div><font face="courier new, monospace">        log4perl.appender.LOG1.max         = 31</font></div><div><font face="courier new, monospace">        <a href="http://log4perl.appender.LOG1.TZ">log4perl.appender.LOG1.TZ</a>          = America/Sao_Paulo</font></div>

<div><font face="courier new, monospace">        log4perl.appender.LOG1.DatePattern = yyyy-MM-dd</font></div><div><font face="courier new, monospace">        log4perl.appender.LOG1.layout      = Log::Log4perl::Layout::PatternLayout</font></div>

<div><font face="courier new, monospace">        log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n</font></div><div><font face="courier new, monospace">    );</font></div><div><font face="courier new, monospace"><br>

</font></div><div><font face="courier new, monospace">    Log::Log4perl::init(\$log_conf);</font></div><div><font face="courier new, monospace">    $logger = Log::Log4perl::get_logger();</font></div><div><font face="courier new, monospace"><br>

</font></div><div><font face="courier new, monospace">    Unix::PID->new()->pid_file( $CONFIG{cfg}->{pid_file} )</font></div><div><font face="courier new, monospace">                or die "Processo já em execução\n";</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    return 1;</font></div><div><font face="courier new, monospace">}</font></div></div><div><font face="courier new, monospace"><br>

</font></div><div style><font face="courier new, monospace"># carrega o hash checker com os parametros de verificação</font></div><div><div><font face="courier new, monospace">BEGIN {</font></div><div><font face="courier new, monospace">    %CHECKER = (</font></div>

<div><font face="courier new, monospace">        file => {</font></div><div><font face="courier new, monospace">            documentation => 'Informa a localização do arquivo de configuração',</font></div><div>

<font face="courier new, monospace">            required      => 1,</font></div><div><font face="courier new, monospace">            where         => sub { return 1 if -e $CONFIG{file} },</font></div><div><font face="courier new, monospace">        },</font></div>

<div><font face="courier new, monospace">    );</font></div><div><font face="courier new, monospace">}</font></div></div><div><font face="courier new, monospace"><br></font></div><div style><font face="courier new, monospace"># só para garantir (ou não) a remoção do arquivo de pid</font></div>

<div style><font face="courier new, monospace">END {</font></div><div style><span style="font-family:'courier new',monospace">   unlink $CONFIG{cfg}->{pid_file};</span><br></div><div style><font face="courier new, monospace">}</font></div>

<div><br></div></div><div style></code></div><div style><br></div><div class="gmail_extra"><br><div class="gmail_quote">Em 25 de março de 2013 16:05, 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>Mestres,</div><div><br></div><div>   Obrigado por todas as dicas, foram muito valiosas.</div>

<div>   Eu utilizo Perl para rotinas de sysadmin e implementações para Asterisk (AMI e AGI).</div><div><br></div><div>   Hernan, nesse Equinócio acho que não consigo escrever um artigo ainda. Estou muito fraco, o conteúdo não séria de interesse de ninguém além de mim ... rsrs ... mas já estou fazendo anotações para escrever um para o próximo, só não sei se vai ser de interesse da comunidade. Será sobre Perl voltado para Asterisk.</div>


<div><br></div><div>   Voltando ao assunto principal, para mim, pelo menos agora, a melhor opção para reutilizar o código é o que o Ricardo mostrou. Acho que é muita pouca coisa para criar um módulo, além do que não domino nem o básico do básico para querer me aventurar por áreas que podem me trazer mais dor de cabeça.</div>


<div><br></div><div>   Sobre o retorno, o que o Solli colocou sobre passar uma referência para retornar as informações e no retorno mesmo voltar só se concluiu ou não me agradou bastante, pois já utilizo essa técnica em C#, mais em Perl não sabia como fazer.</div>


<div>   Na questão de avisar o consumidor sobre eventuais erros, no meu caso é só log mesmo, pois o que faço é tudo rotina de servidor. Mais isso suscitou outra dúvida, que colocarei no final.</div><div><br></div><div>   Também vou adotar o padrão que o Danie sugeriu para nomenclaturas.</div>


<div><br></div><div>   E o artigo que o Marcio sugeriu eu ainda estou tentando entender totalmente, digamos que estou em 30% ... rsrsrs</div><div><br></div><div>   As novas dúvidas são:</div><div>   1. Onde e como guardar parâmetros como IPs, Users, Password, DBname e etc? Hoje eu declaro variáveis globais no inicio e atribuo esses valores a elas, depois passo como parâmetro para as funções, mais acho que é meio tosco isso. Usar banco de dados como alguns usam, também acho estranho, até porque teria que guardar os dados de conexão em algum lugar.</div>


<div><br></div><div>   2. Na questão de logs, hoje simplesmente gravo em arquivo texto e tenho que ficar monitorando, ou em alguns casos, os admins tem que ficar monitorando. As rotinas que faço em shell eu gravo os logs usando os recursos do syslog, pois na maioria dos casos ele tá configurado para enviar e-mail e etc de acordo com a severidade do caso. Os admins me cobram isso direto porque eles tem que ficar olhando os meus logs. Em Perl dá para usar os recursos do syslog para gravar os logs? Se der, é mais fácil  pq o syslog se vira com o resto e na maioria dos casos não sou eu que tenho que configura-lo. :-)</div>


<div><br></div><div>[...]´s</div><span class=""><font color="#888888"><div><br></div><div>Marcio</div><div><br></div><div><br></div>
</font></span><br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa
</div></div></div>