捕获日志一段时间
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
解释:
tail
一个日志文件并通过管道传输到 grep
,awk
以在 END
处处理和生成报告。 运行 这些在命令组中(在 ()
内)
- 等待 60 秒
- 杀死进程组的子进程(
tail
、grep
、awk
)
- 杀死命令组
现在的问题是当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 包装器来在终止时编写报告。
我正在尝试捕获一段时间内的日志,对其进行解析并生成报告。这就是我所做的
(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
处处理和生成报告。 运行 这些在命令组中(在()
内)- 等待 60 秒
- 杀死进程组的子进程(
tail
、grep
、awk
) - 杀死命令组
现在的问题是当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 包装器来在终止时编写报告。