捕获日志一段时间

时间:2015-03-03 04:01:06

标签: bash unix awk

我试图在一段时间内捕获日志,解析它并生成报告。这就是我的工作

(tail -F log_file | grep --line-buffered some_text | awk '{process lines} END {produce report}') & pid=$! && disown
sleep 60 
pkill -TERM -P $pid
kill -TERM $pid

说明:

  1. tail日志文件和管道grepawk来处理并生成END的报告。在命令组(()
  2. 中运行它们
  3. 等待60秒
  4. 杀死进程组的子级(tailgrepawk
  5. 杀死命令组
  6. 现在问题是当awk被杀时,它不会写报告(完成END部分)!我在这做错了什么?你能建议一个解决方法吗?

1 个答案:

答案 0 :(得分:2)

您已经解释了您的问题。 “当Awk被杀时,它不会写报告。”

正确的解决办法是只杀死tail,然后等待管道的其余部分完成。

如果你的tail支持--pid=参数,那很简单 - 只需在后台启动一个标记sleep进程,只要你需要运行,杀死哨兵,等待tail退出。或者使用您已经使用的sleep 60;只需在tail管道之前启动它。

sleep 60 &
zzz=$!
tail -F log_file --pid=$zzz | awk '/some_text/ {process lines} END {produce report}'
wait $zzz

(还要注意重构失去无用的grep | awk。)

如果没有,事情就会变得更加复杂。我可以想象,通过在子shell中设置一个聪明的trap可能是可能的,但我可能只需编写一个带有信号处理程序的简短Python或Perl包装器来在终止时编写报告。