捕获日志一段时间

Capture logs for a duration

我正在尝试捕获一段时间内的日志,对其进行解析并生成报告。这就是我所做的

(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部分)!我在这里做错了什么?您能提出解决方法吗?

您已经解释了您的问题。 "When Awk is killed, it won't write the report."

正确的解决方案是只终止 tail 然后等待管道的其余部分完成。

如果您的 tail 支持 --pid= 参数,那很简单——只需在后台启动哨兵 sleep 进程,运行 只要您需要to,杀死哨兵,等待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 包装器来在终止时编写报告。