我试图在一段时间内捕获日志,解析它并生成报告。这就是我的工作
(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
说明:
tail
日志文件和管道grep
,awk
来处理并生成END
的报告。在命令组(()
)tail
,grep
,awk
)现在问题是当awk
被杀时,它不会写报告(完成END
部分)!我在这做错了什么?你能建议一个解决方法吗?
答案 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包装器来在终止时编写报告。