Я пишу сценарий Perl для автоматизации определенных процессов в наших базах данных Oracle. Одна часть сценария включает перевод сценария в спящий режим до тех пор, пока в журнале предупреждений не будет отображаться база данных.
Я собираюсь поспать до (logevalmodule). Модуль logevalmodule будет подпроцедурой, которая открывает и отслеживает журнал предупреждений с помощью tail -f, возвращающего истину, когда в журнале появляется слово OPEN.
Может ли кто-нибудь помочь мне с возможными решениями. У меня есть два препятствия, чтобы заставить эту работу работать. Путь к журналу предупреждений не будет в одном и том же месте для всех баз данных на сервере Oracle, например apps13 / oracle / admin / db1 / bdump и apps14 / oracle / admin / db2 / bdump. Другое препятствие - отформатировать хвост -f в скрипте.
Спасибо.
Относительно местоположения журнала:
1) Если у вас есть необходимые привилегии в Oracle, вы можете узнать расположение каталога bdump, запросив параметр v $ для "BACKGROUND_ DUMP_DEST".
2) bdump обычно находится в $ ORACLE_BASE / admin / $ ORACLE_SID / bdump. Существование этих переменных среды обязательно для пользователя "oracle", или они могут быть проанализированы из / etc / oratab
Что касается создания модуля Perl для мониторинга материалов, появляющихся в файлах журнала, я настоятельно рекомендую использовать Perl Object Environment (POE). Раньше я создавал кучу мониторов журналов, используя его, и он довольно простой и довольно эффективный. Есть хороший пример, показывающий некоторый хвостовой мониторинг \ обработку журнала веб-сервера на Сайт POE Cookbook здесь.
Что касается другой части проблемы, все, что я могу предложить, - это настроить группу POE Wheels, нацеленную на каждый журнал, который вам нужно отслеживать, заполненный каким-либо образом, который вам подходит. Лично я просто прочитал желаемые целевые местоположения из файла.
Как насчет чего-то вроде:
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';
}
Очевидно, что обработка ошибок может потребовать некоторой работы, но это должно сканировать все файлов журнала, затем завершите функцию, когда один из них содержит (вновь добавляется) OPEN. Вам не понадобится цикл сна + проверки.
Кроме того, поскольку "tail -f" для нескольких файлов отображает имя файла, когда блок выходит из одного из файлов, вы можете записать имя файла в регулярное выражение и вернуть имя файла журнала, который только что объявил " ОТКРЫТО". Еще одно предостережение: делать это как единый процесс, а не как двухэтапный конвейер, означает, что вы можете пропустить некоторые события во время обслуживания более ранних событий.