
[英]Why does my Java client/server app hang when using ObjectInputStream but doesn't when I use BufferedReader with InputStreamReader?
[英]Why does grep hang when run against the / directory?
我的问题分为两部分:
1)当grep“/”下的所有文件时为什么grep会挂起?
例如 :
grep -r 'h' ./
(注意:在挂起/崩溃之前,我注意到我看到一些关于套接字的“没有这样的设备或地址”消息....
当然,我知道grep不应该针对套接字运行,但我认为既然套接字只是Unix中的文件,它应该返回负结果,而不是崩溃。
2)现在,我的后续问题:无论如何 - 我怎么能grep整个文件系统? 在执行此操作时是否应该省略某些* NIX目录? 特别是,我正在寻找所有最近写的日志文件。
正如@ninjalj所说,如果你不使用-D skip
, grep
会尝试读取你所有的设备文件,套接字文件和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(用于find
和xargs
)和/或GNU grep。
在尝试任何此操作之前,请使用df
查看根文件系统的大小。 我的目前是268千兆字节; 搜索所有这些可能需要几个小时。 花费几分钟(a)限制你搜索的文件和(b)确保命令正确将非常值得你花费的时间。
默认情况下, grep
尝试读取每个文件。 使用-D skip
跳过设备文件,套接字文件和FIFO文件。
如果你一直看到错误消息,那么grep
就不会挂起。 在第二个窗口中打开iotop
,看看你的系统是多么努力将所有内容从存储介质中拉出来 ,一块一块地存放到主内存中。 此操作应该很慢,或者您有一个非常准确的系统。
现在,我的后续问题:无论如何 - 我怎么能grep整个文件系统? 在执行此操作时是否应该省略某些* NIX目录? 特别是,我正在寻找所有最近写的日志文件。
打击整个FS很少是一个好主意。 尝试grepping应该写入日志文件的目录; 可能是/var/log
。 更妙的是,如果你知道你要找的文件的名称,任何东西(比方说,他们有扩展.log
),然后做一个find
或locate
和grep
那些程序上报的文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.