我正在尝试编写Perl脚本来捕获系统日志输出,而循环会每隔一段时间运行一次系统命令。我希望脚本在(unix)命令行上执行相当于我经常做的事情:通过在后台将/var/log/jbossas/default/console.log
拖入新文件来获取Java进程线程转储,同时运行kill -QUIT [PID]
任意在前景中间隔的次数。我不需要检查或处理日志文件的输出,我只是希望它在循环运行时转到新文件;一旦循环退出,后台任务也应该退出。
# basic loop
# $process is PID given as argument
my $duration = 6;
my $dumps = 0;
until ($dumps == $duration) {
system "kill -QUIT $process";
$dumps++;
print STDOUT "$dumps of $duration thread dumps sent to log.\n";
print STDOUT "sleeping for $frequency seconds\n";
sleep 30;
}
不知何故,我需要将此循环包装在另一个循环中,该循环将知道何时退出,然后退出后台日志拖尾任务。我意识到这在Perl中应该是微不足道的,但我不知道如何继续,我发现的其他问题或例子并没有做到我在这里想做的事情。似乎使用Perl的system
阻止我进入内循环; exec
分离尾部工作,所以我不确定在内部循环运行后我是如何退出它的。我非常希望只使用核心Perl模块,而不是File :: Tail或任何其他CPAN模块
提前感谢任何反馈,并随意嘲笑我的Perlessness。我已经在这里找到了类似的问题,但如果我错过了一个似乎可以解决我的问题,我会很感激你将我链接到它。
答案 0 :(得分:1)
这可能最适合事件循环。阅读Making a Perl daemon that runs 24/7 and reads from named pipes的答案,这将为您介绍如何在事件循环中读取文件句柄。只需打开一个到尾部输出的管道,将其打印到文件,在计时器事件上运行kill,然后一旦完成计时器事件就发出信号退出。