perl 问题需要从文件中获取值

perl 问题需要从文件中获取值

我正在编写一个 perl 脚本来自动化 Oracle 数据库上的某些进程。脚本的一部分涉及使脚本处于休眠状态,直到警报日志显示数据库已打开。

我打算执行 sleep till (logevalmodule)。logevalmodule 将是一个子程序,它使用 tail -f 打开并监视警报日志,当日志中出现单词 OPEN 时返回 true。

有人能帮我找到可能的解决方案吗?我有两个障碍要实现这个目标。警报日志的路径不会在 Oracle 服务器上所有数据库的同一位置,例如“apps13/oracle/admin/db1/bdump”和“apps14/oracle/admin/db2/bdump”。另一个障碍是将 tail -f 格式化为脚本。

谢谢。

答案1

在构建 Perl 模块来监控日志文件中出现的内容方面,我强烈建议使用 Perl 对象环境 (POE)。我过去用它构建了很多日志监控器,它非常简单而且非常有效。有一个很好的例子展示了一些对 Web 服务器日志的尾部监控\处理POE 食谱网站在这里

至于问题的另一部分,我所能建议的就是设置一组 POE Wheels,针对您需要监控的每个日志,以适合您的方式填充。我个人只是从文件中读取所需的目标位置。

答案2

关于日志位置:

1) 如果您具有 Oracle 的正确权限,则可以通过查询 v$parameter 中的“BACKGROUND_ DUMP_DEST”来获取 bdump 目录的位置。

2) bdump 通常位于 $ORACLE_BASE/admin/$ORACLE_SID/bdump 这些环境变量的存在对于用户“oracle”来说是必需的,或者可以从 /etc/oratab 中解析它们

答案3

那么类似这样的情况怎么样:

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”会在某个文件出现块时显示文件名,因此您可以在正则表达式中捕获文件名,并返回刚刚宣布“OPEN”的日志文件的名称。另一个需要注意的是,将其作为单个过程而不是两步管道执行,这意味着您在处理早期事件时可能会错过一些事件。

相关内容