Legal, se tiver dúvida de pq fiz assim ou assado, é só perguntar ! Solli Honorio
Em 26 de março de 2013 17:04, Marcio - Google <[email protected]> escreveu: > Solli, > > Muito obrigado pelos exemplos. Estou lendo o artigo também. > > [...]´s > > Marcio > > Em 26 de março de 2013 09:07, Solli Honorio <[email protected]> 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 <[email protected] > >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 > -- "o animal satisfeito dorme". - Guimarães Rosa
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
