在日志文件上运行使用grep/awk的脚本会影响应用程序写入日志文件吗?

在日志文件上运行使用grep/awk的脚本会影响应用程序写入日志文件吗?,awk,scripting,grep,Awk,Scripting,Grep,多年来,我一直使用脚本监控日志文件并从中提取数据,从未质疑过大多数人认为理所当然的基本工具集。特别是grep和awk几乎被社区中的每个人使用 我发现了当前的grep bug(有些可以追溯到几年前): 以及GNU grep 2.6.3的手册页: 已知错误 {n,m}构造中的大量重复计数可能会导致grep使用大量内存。此外,某些其他晦涩的正则表达式需要指数级的时间和空间,并可能导致grep耗尽内存 反向引用非常慢,可能需要指数时间 以及GNU Awk 3.1.7的手册页: 虫子 鉴于命令行变量赋值

多年来,我一直使用脚本监控日志文件并从中提取数据,从未质疑过大多数人认为理所当然的基本工具集。特别是grep和awk几乎被社区中的每个人使用

我发现了当前的grep bug(有些可以追溯到几年前):

以及GNU grep 2.6.3的手册页:

已知错误

{n,m}构造中的大量重复计数可能会导致grep使用大量内存。此外,某些其他晦涩的正则表达式需要指数级的时间和空间,并可能导致grep耗尽内存

反向引用非常慢,可能需要指数时间

以及GNU Awk 3.1.7的手册页:

虫子

鉴于命令行变量赋值功能,-F选项是不必要的;它只保留向后兼容性

语法无效的单字符程序往往会溢出解析堆栈,生成一条毫无帮助的消息。在完全一般的情况下,这样的程序很难诊断,而且这样做的努力真的不值得

例如,我对限制感兴趣

  • 使用复杂正则表达式时
  • 不旋转的超大文件
  • 每百分之一秒写入数千次的日志
是否只是监视脚本的内存使用情况以确保它没有使用大量内存

为可能需要很长时间才能执行的脚本实现超时功能是否是一种良好的做法

在使用这些工具构建解决方案时,人们是否也使用其他良好的标准和结构

我找到了相当于findstr的非常有用的答案,让我更好地理解Windows环境中的脚本:
awk/grep命令都以只读模式读取日志文件,因此,由于应用程序(写入模式)和awk/grep程序(只读模式)同时访问日志文件,因此不会对日志文件的损坏产生影响


awk/grep程序肯定会占用CPU和内存,这会影响应用程序写入日志文件。此影响类似于使用系统资源的任何其他流程。grep/awk命令也不例外。根据grep/awk脚本所做的工作,它们可能会消耗大量的CPU/RAM。任何语言编写的代码都可能导致问题。正如评论中所建议的,最好限制监控过程
ulimit
cgroup
是可用于约束资源的选项。另一个好的选择是使用
timeout
,如果脚本占用的时间超过预期时间,则会终止脚本。

awk/grep命令都以只读模式读取日志文件,因此不会因为应用程序(写模式)和awk/grep程序(只读模式)同时访问而对日志文件造成影响


awk/grep程序肯定会占用CPU和内存,这会影响应用程序写入日志文件。此影响类似于使用系统资源的任何其他流程。grep/awk命令也不例外。根据grep/awk脚本所做的工作,它们可能会消耗大量的CPU/RAM。任何语言编写的代码都可能导致问题。正如评论中所建议的,最好限制监控过程
ulimit
cgroup
是可用于约束资源的选项。另一个好的选择是使用
timeout
,如果脚本占用的时间超过预期时间,它将终止脚本。

我将使用
ulimit
来约束监视脚本(内存、CPU时间…)。你考虑过这个选项吗?我会用<代码> ulimIT < /Cuff>来约束监视脚本(内存,CPU时间……)。你考虑过这个选择吗?