2015-03-03 46 views
1

我正在尝试捕获一段时间的日志,解析它并生成报告。这是我做的捕获一段时间的日志

(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. 等待60秒
  3. 杀死进程群的儿童(tailgrepawk
  4. 杀死命令组

现在问题当awk死亡时,它不会写报告(完成END部分)!我在这里做错了什么?你能提出一种解决方法吗?

回答

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封装,并带有一个信号处理程序在终止时写入报告。

+0

'tail --pid'是这里的关键。不知道这个选项 – ubi 2015-03-03 05:21:33