【问题标题】:Why does grep hang when run against the / directory?为什么 grep 在 / 目录下运行时会挂起?
【发布时间】:2011-11-01 18:29:40
【问题描述】:

我的问题分为两部分:

1) 为什么当我 grep "/" 下的所有文件时 grep 挂起?

例如:

grep -r 'h' ./

(注意:就在挂起/崩溃之前,我注意到我看到一些关于套接字的“没有这样的设备或地址”消息......

当然,我知道 grep 不应该针对套接字运行,但我认为由于套接字只是 Unix 中的文件,它应该返回否定结果,而不是崩溃。

2) 现在,我的后续问题:无论如何——我如何 grep 整个文件系统?是否有某些 *NIX 目录在执行此操作时应该省略?特别是,我正在寻找所有最近编写的日志文件。

【问题讨论】:

  • grep 没有挂,你的 -r 表示递归系统上的所有文件。那是多少千兆字节?此外,任何 NFS 挂载的文件都以网络连接速度进行处理,而不是作为直接连接到 CPU 的磁盘上的本地文件。那将需要很长时间。祝你好运。

标签: sockets unix crash filesystems grep


【解决方案1】:

正如@ninjalj 所说,如果您不使用-D skipgrep 将尝试读取您所有的设备文件、套接字文件和FIFO 文件。特别是在 Linux 系统(和许多 Unix 系统)上,它会尝试读取 /dev/zero,这似乎是无限长的。

你会等一会儿。

如果您正在寻找系统日志,从/var/log 开始可能是最好的方法。

如果您正在寻找可能存在于文件系统中任何位置的内容,您可以执行以下操作:

find / -xdev -type f -print0 | xargs -0 grep -H pattern

find-xdev 参数告诉它留在单个文件系统中;这将避免/proc/dev(以及任何挂载的文件系统)。 -type f 将搜索限制为普通文件。 -print0 打印由空字符而不是换行符分隔的文件名;这样可以避免文件名中包含空格或其他有趣字符的问题。

xargs 在其标准输入上读取文件名列表(或其他任何内容),并在列表中的所有内容上调用指定的命令。 -0 选项适用于 find-print0

grep-H 选项告诉它为每个匹配项加上文件名的前缀。默认情况下,grep 仅在其命令行上有两个或多个文件名时才会执行此操作。由于xargs 将其参数拆分为批次,因此最后一批可能只有一个文件,这会给您带来不一致的结果。

考虑使用find ... -name '*.log' 将搜索限制为名称以.log 结尾的文件(假设您的日志文件具有此类名称),和/或使用grep -I ... 跳过二进制文件。

请注意,这一切都取决于 GNU 特定的功能。其中一些选项在 MacOS(基于 BSD)或其他 Unix 系统上可能不可用。请查阅您的本地文档,并考虑安装 GNU findutils(用于 findxargs)和/或 GNU grep。

在尝试任何这些之前,请使用df 查看您的根文件系统有多大。我的目前是 268 GB;搜索所有这些可能需要几个小时。花几分钟 (a) 限制您搜索的文件和 (b) 确保命令正确将非常值得您花时间。

【讨论】:

  • 这比 xargs 快:find / -xdev -type f -exec grep -H {} +.
【解决方案2】:

默认情况下,grep 会尝试读取每个文件。使用-D skip跳过设备文件、socket文件和FIFO文件。

【讨论】:

    【解决方案3】:

    如果您不断看到错误消息,则表明 grep 没有挂起。在第二个窗口中保持iotop 处于打开状态,以查看您的系统如何努力将所有内容从其存储介质中逐个拉到主内存中。此操作应该很慢,或者您的系统非常简陋。

    现在,我的后续问题:无论如何——我如何 grep 整个文件系统?是否有某些 *NIX 目录我们应该在执行此操作时忽略?特别是,我正在查找所有最近写入的日志文件。

    Gregging 整个 FS 很少是一个好主意。尝试 grepping 应该写入日志文件的目录;可能/var/log。更好的是,如果您对要查找的文件的名称有所了解(例如,它们具有扩展名 .log),然后对这些程序报告的文件执行 findlocategrep .

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2012-02-17
    • 2018-07-29
    相关资源
    最近更新 更多