2012-02-26 1765 views
9

我正在搜索文件系统并使用grep。我看到的一切工作,直到出现这样的错误:grep:/ proc/sysrq-trigger:输入/输出错误

Grep: /proc/sysrq-trigger: Input/output error 

我发现在网上,别人都来翻过了同样的问题,各个地方的信息,但无处真的是有什么事情的工作。我尝试了2>/dev/null,它可以抑制错误,但不会'跳过文件',这实际上是我希望它会做的。相反,它只是停止进程(这是一个利用grep的find/sed进程)。我认为有一种方法可以使用grep指定要排除的文件,但我希望可能有更强大和更优雅的解决方案。

+0

所以使用'find $ whatever! -wholename“/ proc/sysrq-trigger”'? – 2012-02-26 11:21:54

+0

*为什么*你在'/ proc'中递归读取文件?如果您以更广泛的方式告诉我们您想要做什么,我们可能会帮助您更多。 – thkala 2012-02-26 18:45:23

+0

@thkala试图搜索具有特定字符串的文件,然后删除该文件的全部内容。 – user1166981 2012-02-29 21:33:32

回答

16

听起来好像您是递归搜索整个文件系统层次结构。这在大多数系统上无法按预期工作。

在Linux上至少有/proc/sys是虚拟文件系统 - 它们不对应磁盘上的实际文件。 /dev中的特殊文件也不是实际文件 - 它们对应于系统中的某些设备,例如硬盘,输入设备e.t.c。修改 - 有时甚至是读 - 这些目录下的文件不应以不受控制的方式进行修改,因为您可能会崩溃内核,破坏文件系统甚至永久损坏硬件。

由于您使用find进行搜索,您需要限制其搜索的范围:

  • 使用明确否定-path选项:

    find/-maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*' 
    
  • 使用-prune选项:

    find/-maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print 
    
  • 使用-xdev选项,以避免下降到其它文件系统完全:

    find/-maxdepth 2 -xdev -type f 
    

,因为你需要微调的find输出可以使用尽可能多的-path和/或-prune选项。不过,我建议你先检查它的输出,然后再将它传递到管道中的任何后期阶段。

编辑:

这里有以不受控制的方式访问特定的文件时造成的损害的一些例子 - 通常为root

  • 旧版内核used to crash如果/proc/kcore被读为root。我认为这不再发生,但是我自从/proc/kcore被引入到2.4.x内核系列和它的occasionally pops up again之后,所以我没有心情去实际测试它...

  • 读取块设备通过其设备节点/dev/可能会严重减慢该设备上的其他任何操作,因为它会绕过VFS和各种缓存。想象一下,例如,直接读取6TB RAID-5部分,而其他进程则尝试通过已安装的文件系统正确使用它。使用-type ffind应该防止发生这种情况。

  • 由于您提到的修改,您可以通过破坏其固件,通过/dev/mtd*可以轻松地制作嵌入式设备。在某些情况下,如果没有一些非常极端的措施,就无法从这种腐败中恢复过来

+0

我明白,我不知道你可能会因为阅读而损坏它该文件 - 我想这可能是由于阻止其他重要进程的访问?感谢您的详细回复,非常感谢。例如,我可以将更多排除的路径链接在一起! -path'/ proc/*! -path'/ sys/*'等? – user1166981 2012-02-29 22:06:47

+0

1.有一些文件在以root身份进行读取时历史上会导致问题。当读取'/ proc/kcore'时,我的一个旧系统崩溃了 - 如果有东西试图直接读取我的RAID阵列设备(尽管'-type f'至少应该防止这种情况),这会非常恼人* – thkala 2012-02-29 22:11:46

+0

2.你不只是阅读,你提到的修改。现在'sed -i'通常会在替换原始文件之前写入临时文件,以保护不可删除的文件,但其他任何方法都可以轻松修改原始文件,导致*很多*损害。 – thkala 2012-02-29 22:14:18

5

的grep有,您可以使用,以避免/ proc和/ SYS

我用这样的命令最近,我只知道一个参数的名称的--exclude-DIR = DIR选项我期望在某个配置文件中,但不知道文件的路径。

cd/&& grep -rI --exclude-dir=proc --exclude-dir=sys pattern *