[SP-pm] Subs

Marcio - Google marciorp at gmail.com
Tue Mar 26 13:04:40 PDT 2013


Solli,

   Muito obrigado pelos exemplos. Estou lendo o artigo também.

[...]´s

Marcio

Em 26 de março de 2013 09:07, Solli Honorio <shonorio em gmail.com> escreveu:

> Marcio, a minha estrutura básica de script está abaixo mas recomendo
> fortemente que você leia http://sao-paulo.pm.org/equinocio/2011/set/8
>
> Quando eu preciso utilizar fork, eu estou utilizando o
> Parallel::ForkManager, pois a minha vida ficou muito mais simples.
>
> <code>
> #!/usr/bin/env perl
> use common::sense;
> use Unix::PID;
> use Getopt::Long;
> use Log::Log4perl;
> use Config::Simple;
>
> use sigtrap 'handler' => \&finish_process, 'INT', 'ABRT', 'QUIT', 'TERM';
>
> binmode STDOUT, ":utf8";
>
> my $VERSION = '1.00';
> my ($logger, %CONFIG, %CHECKER);
>
> $CONFIG{NUM_PROCESS}  = 10;   # Numero máximo de processo
> $CONFIG{TIMEOUT}      = 300;  # timeout nos processos
> $CONFIG{stats}{start} = time();
>
> Getopt::Long::Configure('bundling');
> GetOptions(
>     "v|version" => sub { show_version() } ,
>     "h|help"    => sub { help() } ,
>     "f|file=s"  => \$CONFIG{file} ,
> );
>
> check_data();
> init_script();
>
> # responsável por finalizar o script de maneira correta
> sub finish_process {
>     $logger->info("Encerrando o processamento");
>
>     unlink $CONFIG{cfg}->{pid_file};
>
>     exit 0;
> }
>
> # responsável por verificar se todos os dados fornecido
> # via linha de comando estão corretas
> sub check_data {
>     for my $key ( keys %CHECKER ) {
>         if (! $CHECKER{$key}{where}->() ) {
>             say $CHECKER{$key}{documentation};
>         }
>     }
> }
>
> # carrega o arquivo de configuração, inicia o log e
> # confirma se já não está em execução.
> sub init_script{
>     Config::Simple->import_from( $CONFIG{file}, \%{$CONFIG{cfg}} );
>     my $log_conf = qq(
>         log4perl.rootLogger                = DEBUG, LOG1
>         log4perl.appender.LOG1             = Log::Dispatch::FileRotate
>         log4perl.appender.LOG1.filename    = $CONFIG{cfg}->{log_file}
>         log4perl.appender.LOG1.mode        = append
>         log4perl.appender.Log1.utf8        = 1
>         log4perl.appender.LOG1.autoflush   = 1
>         log4perl.appender.LOG1.max         = 31
>         log4perl.appender.LOG1.TZ          = America/Sao_Paulo
>         log4perl.appender.LOG1.DatePattern = yyyy-MM-dd
>         log4perl.appender.LOG1.layout      =
> Log::Log4perl::Layout::PatternLayout
>         log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n
>     );
>
>     Log::Log4perl::init(\$log_conf);
>     $logger = Log::Log4perl::get_logger();
>
>     Unix::PID->new()->pid_file( $CONFIG{cfg}->{pid_file} )
>                 or die "Processo já em execução\n";
>
>     return 1;
> }
>
> # carrega o hash checker com os parametros de verificação
> BEGIN {
>     %CHECKER = (
>         file => {
>             documentation => 'Informa a localização do arquivo de
> configuração',
>             required      => 1,
>             where         => sub { return 1 if -e $CONFIG{file} },
>         },
>     );
> }
>
> # só para garantir (ou não) a remoção do arquivo de pid
> END {
>    unlink $CONFIG{cfg}->{pid_file};
> }
>
> </code>
>
>
> Em 25 de março de 2013 16:05, Marcio - Google <marciorp em gmail.com>escreveu:
>
>> Mestres,
>>
>>    Obrigado por todas as dicas, foram muito valiosas.
>>    Eu utilizo Perl para rotinas de sysadmin e implementações para
>> Asterisk (AMI e AGI).
>>
>>    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.
>>
>>    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.
>>
>>    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.
>>    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.
>>
>>    Também vou adotar o padrão que o Danie sugeriu para nomenclaturas.
>>
>>    E o artigo que o Marcio sugeriu eu ainda estou tentando entender
>> totalmente, digamos que estou em 30% ... rsrsrs
>>
>>    As novas dúvidas são:
>>    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.
>>
>>    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. :-)
>>
>> [...]´s
>>
>> Marcio
>>
>>
>>
>> =begin disclaimer
>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
>
> --
> "o animal satisfeito dorme". - Guimarães Rosa
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130326/39cfc483/attachment.html>


More information about the SaoPaulo-pm mailing list