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. >> >> 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: [email protected] >> 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: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > >
=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
