[SP-pm] Subs

Solli Honorio shonorio at gmail.com
Tue Mar 26 06:07:34 PDT 2013


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
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130326/1156f924/attachment-0001.html>


More information about the SaoPaulo-pm mailing list