Grep: /proc/sysrq-trigger: 输入/输出错误
·
问题:Grep: /proc/sysrq-trigger: 输入/输出错误
我正在搜索文件系统并使用 grep。我看到一切正常,直到出现此错误:
Grep: /proc/sysrq-trigger: Input/output error
我在网上的各个地方都找到了其他人遇到同样问题的信息,但没有任何地方真正有效。我尝试了 2>/dev/null 来抑制错误但没有“跳过文件”,这确实是我希望它会做的。相反,它只是停止进程(这是一个使用 grep 的 find/sed 进程)。我认为有一种方法可以使用 grep 指定要排除的文件,但我希望可能有一个更强大和优雅的解决方案。
解答
听起来好像您正在递归搜索整个文件系统层次结构。在大多数系统上,这不会像预期的那样工作。
在 Linux 上,至少/proc和/sys是虚拟文件系统——它们不对应于磁盘上的实际文件。/dev中的特殊文件也不是实际文件——它们对应于您系统上的一些设备,例如硬盘、输入设备等。修改(有时甚至读取)这些目录下的文件绝不应以不受控制的方式发生,因为您可能会导致内核崩溃,破坏文件系统,甚至对硬件造成永久性损坏。
由于您使用find执行搜索,因此您需要限制其搜索范围:
- 使用显式否定的
-path选项:
查找 / -maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*'
- 使用
-prune选项:
zoz100027`
find / -maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print
* 使用`-xdev`选项来完全避免下降到其他文件系统:
查找 / -maxdepth 2 -xdev -type f
您可以根据需要使用尽可能多的`-path`和/或`-prune`选项来微调`find`的输出。不过,我建议您检查其输出,然后再将其传递到管道中的任何后期阶段。
**编辑:**
以下是一些以不受控制的方式访问某些文件时造成的损坏的示例 - 通常为`root`:
* 如果`/proc/kcore`被读取为`root`,则旧内核[会导致](https://bugzilla.kernel.org/show_bug.cgi?id=13850)崩溃。我相信这不再发生,但是自从`/proc/kcore`在 2.4.x 内核系列中引入后,我就遇到了这种情况,并且[偶尔会再次弹出](http://osdir.com/ml/xen-development/2011-02/msg01157.html),所以我没有心情实际测试它...
* 通过`/dev/`中的设备节点读取块设备会严重减慢该设备上的任何其他操作,因为它绕过了 VFS 和各种缓存。例如,想象一下,直接读取 6TB RAID-5 分区,而其他进程试图通过已安装的文件系统正确使用它。在`find`中使用`-type f`应该可以防止这种情况发生。
* 既然你提到了修改,你可以很容易地通过破坏它的固件来破坏一个嵌入式设备,可以通过`/dev/mtd*`访问它。在某些情况下,如果不采取一些非常极端的措施,就不可能从这种腐败中恢复过来。
更多推荐




所有评论(0)