我正在编写一个Perl脚本来自动化我们的Oracle数据库上的某些进程。 脚本的一部分涉及将脚本置于睡眠状态,直到警报日志显示数据库打开。
我打算睡觉,直到(logevalmodule)。 logevalmodule将是一个子过程,它打开并使用tail -f监视警报日志。当日志中出现OPEN字时返回true。
任何人都可以帮助我解决可能的问题 我有两个障碍,使这项工作。 警报日志的path将不在Oracle服务器上的所有数据库的相同位置,例如“apps13 / oracle / admin / db1 / bdump”和“apps14 / oracle / admin / db2 / bdump”。 另一个障碍是将尾部-f格式化为脚本。
谢谢。
在构buildPerl模块来监视日志文件中出现的东西方面,我强烈推荐使用Perl对象环境(POE)。 我在过去使用过一些日志监视器,它非常简单而且非常有效。 这里有一个很好的例子,显示POE Cookbook站点上的一个Web服务器日志的尾部监视/处理。
至于问题的其他部分,我所能build议的就是设置一堆POE轮子,以每个需要监视的日志为目标,以某种适合您的方式进行填充。 就我个人而言,我只是从文件中读取所需的目标位置。
关于日志位置:
1)如果您对Oracle拥有适当的权限,则可以通过查询v $参数来获取“bdump”目录的位置,以find“BACKGROUND_ DUMP_DEST”。
2)bdump通常在$ ORACLE_BASE / admin / $ ORACLE_SID / bdump中这些环境variables的存在对于用户“oracle”是强制的,或者它们可以从/ etc / oratab
感觉如何?
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'; }
显然,error handling可能会使用一些工作,但是这应该扫描所有的日志文件,然后在其中一个包含(新添加)OPEN时结束函数。 你不需要睡眠+检查循环。
另外,由于多个文件中的“tail -f”显示文件名,当一个文件块从其中一个文件出来时,你可以用正则expression式捕获文件名,并且返回刚刚宣布“打开”。 另一个警告,做为一个单一的过程,而不是一个二步pipe道,意味着你可能会错过一些事件,而你正在服务的早期事件。