[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