为什么grep在针对/目录运行时挂起?

时间:2011-11-01 18:29:40

标签: sockets unix crash filesystems grep

我的问题分为两部分:

1)当grep“/”下的所有文件时,为什么grep会挂起?

例如:

grep -r 'h' ./

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

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

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

3 个答案:

答案 0 :(得分:16)

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

你会等一会儿。

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

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

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

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

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

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

考虑使用grep将搜索限制为名称以grep结尾的文件(假设您的日志文件具有此类名称),和/或使用xargs跳过二进制文件。< / p>

请注意,所有这些都取决于GNU特定的功能。其中一些选项可能在MacOS(基于BSD)或其他Unix系统上不可用。请参阅本地文档,并考虑安装GNU findutils(适用于find ... -name '*.log'.log)和/或GNU grep。

在尝试任何此操作之前,请使用grep -I ...查看根文件系统的大小。我的目前是268千兆字节;搜索所有这些可能需要几个小时。花费几分钟时间(a)限制你搜索的文件和(b)确保命令正确,这非常值得花时间。

答案 1 :(得分:9)

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

答案 2 :(得分:1)

如果您一直看到错误消息,则grep不会挂起。在第二个窗口中保持iotop打开状态,看看您的系统有多么努力将所有内容从其存储介质中提取到主内存中。这个操作应该很慢,或者你有一个非常准确的系统。

  

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

对整个FS进行掠夺非常不是一个好主意。尝试grepping应该写入日志文件的目录;可能/var/log。更好的是,如果您对所查找文件的名称一无所知(例如,他们的扩展名为.log),那么请执行findlocate和{{1这些程序报告的文件。