perl question precisando obter valor do arquivo

1

Estou escrevendo um script perl para automatizar determinados processos em nossos bancos de dados Oracle. Uma parte do script envolve colocar o script em suspensão até que o log de alerta mostre o banco de dados aberto.

Eu pretendo dormir até (logevalmodule). O logevalmodule será um procedimento secundário que abre e monitora o log de alerta usando tail -f retornando um verdadeiro quando a palavra OPEN aparece no log.

Alguém pode me ajudar com possíveis soluções. Eu tenho dois obstáculos para fazer isso funcionar. O caminho para o log de alerta não estará no mesmo lugar para todos os bancos de dados no servidor Oracle, por exemplo, 'apps13 / oracle / admin / db1 / bdump' e 'apps14 / oracle / admin / db2 / bdump'. O outro obstáculo é formatar a cauda -f no script.

Obrigado.

    
por Dennis Williamson 02.12.2009 / 22:24

3 respostas

1

Em termos de criação de um módulo Perl para monitorar o material que aparece nos arquivos de log, eu recomendaria strongmente o uso do Perl Object Environment (POE). Eu construí um monte de monitores de log usando-o no passado e é bastante simples e bastante eficaz. Há um bom exemplo mostrando alguns processos de monitoramento de cauda de um registro do servidor web no Site do Cookbook POE aqui .

No que diz respeito à outra parte do problema, tudo o que posso sugerir é configurar um grupo de POE Wheels que visam cada registro que você precisa monitorar, preenchido de alguma forma que seja adequado para você. Pessoalmente, eu acabei de ler os locais de destino desejados em um arquivo.

    
por 03.12.2009 / 01:20
1

Em relação à localização do log:

1) Se você tem os privilégios certos no Oracle, você pode obter a localização do diretório do bdump consultando o parâmetro v $ para "BACKGROUND_ DUMP_DEST".

2) O bdump normalmente estará em $ ORACLE_BASE / admin / $ ORACLE_SID / bdump A existência dessas variáveis de ambiente é obrigatória para o usuário "oracle" ou elas podem ser analisadas a partir do / etc / oratab

    
por 03.12.2009 / 07:30
0

Que tal algo como:

sub delay_until_open
  {
  my( @log_files) = @_;
  open( ALL_LOGS, 'tail -0f ' . join( ' ', @log_files) . ' |') || die 'oops, it broke';
  while ( <ALL_LOGS>)
    {
    if ( /OPEN/)
      {
      last;
      }
    }
  close ALL_LOGS || die 'oops, it broke';
  }

Obviamente, o tratamento de erros pode usar algum trabalho, mas isso deve varrer all dos arquivos de log, e finalizar a função quando um deles contiver (recentemente anexado) OPEN. Você não precisará de um loop sleep + check ao redor disso.

Além disso, como "tail -f" em vários arquivos exibe o nome do arquivo quando um fragmento sai de um dos arquivos, você pode capturar o nome do arquivo em um regex e retornar o nome do arquivo de registro que acabou anunciou um "OPEN". Outra ressalva, fazer isso como um único processo, em vez de um pipeline de 2 etapas, significa que você pode perder alguns eventos enquanto estiver atendendo a eventos anteriores.

    
por 03.12.2009 / 04:37

Tags