繁体   English   中英

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

[英]Why does grep hang when run against the / directory?

我的问题分为两部分:

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

例如 :

grep -r 'h' ./

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

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

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

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

你会等一会儿。

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

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

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

-xdev参数find告诉它留一个单一的文件系统中; 这将避免/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千兆字节; 搜索所有这些可能需要几个小时。 花费几分钟(a)限制你搜索的文件和(b)确保命令正确将非常值得你花费的时间。

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

如果你一直看到错误消息,那么grep就不会挂起。 在第二个窗口中打开iotop ,看看你的系统是多么努力将所有内容从存储介质中拉出来 ,一块一块地存放到主内存中。 此操作应该很慢,或者您有一个非常准确的系统。

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

打击整个FS很少是一个好主意。 尝试grepping应该写入日志文件的目录; 可能是/var/log 更妙的是,如果你知道你要找的文件的名称,任何东西(比方说,他们有扩展.log ),然后做一个findlocategrep那些程序上报的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM