我正在尝试编写一个Perl脚本,以便在循环每隔一段时间运行一个系统命令时捕获系统日志输出。我希望脚本执行与我在(unix)命令行中经常执行的操作类似的操作:在后台将/var/log/jbossas/default/console.log
拖入一个新文件中,同时在前台每隔一段时间运行任意次数的kill -QUIT [PID]
以获取java进程线程转储。我不需要检查或处理日志文件输出,当它被尾随时,我只希望它在循环运行时转到一个新文件;一旦循环退出,后台任务也应该退出。
# 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的cc将我的进程阻塞到内部循环中。我强烈希望只使用核心perl模块,而不是file::tail或任何其他cpan模块。
提前感谢你的任何反馈,请随意嘲笑我的无能。我已经在这里寻找类似的问题,但如果我错过了一个似乎解决我的问题,我会感谢你链接我到它。
最佳答案
这可能最适合事件循环。阅读Making a Perl daemon that runs 24/7 and reads from named pipes的答案,这将为您介绍如何在事件循环中读取文件句柄。只需打开管道到尾部输出,将其打印到文件中,在计时器事件上运行杀戮,然后一旦定时器事件完成,只需发出退出信号。
关于linux - Perl:在循环中运行另一个系统命令时在后台尾文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8001956/