我在多个平台上使用了以下 grep 搜索模式:
grep -r -I -D skip 'string_to_match' /
例如在FreeBSD 8.0、FreeBSD 6.4和Debian 6.0 (squeeze) 上。命令从根目录开始进行递归搜索,假定二进制文件没有“string_to_match”并跳过设备、套接字和命名管道。FreeBSD 8.0和FreeBSD 6.4使用 GNU grep 2.5.1 版,Debian 6.0使用 GNU grep 2.6.3 版。在FreeBSD 6.4上,最后打印到 stderr 的信息是"grep: /dev/cuad0: Device busy"。在此 grep 之后,根据“top -m io -o total”,grep 的 I/O 使用情况不存在。在FreeBSD 8.0下同样的行为是正确的,但最后发送到 stderr 的信息是在我的安装中出现“grep: /tmp/.wine-0: Permission denied” 。在 Debian 的情况下,stderr 的最后输出是"grep: /proc/sysrq-trigger: Input/output error"。如果我在 Debian 下检查 grep 进程的 I/O 使用情况,它如下:
root@Debian:~# iotop -bp 22439
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
22439 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % grep -r -I
-D skip 10.10.10.99 /
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
22439 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % grep -r -I
-D skip 10.10.10.99 /
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
22439 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % grep -r -I
-D skip 10.10.10.99 /
^Croot@Debian:~#
这可能是什么原因造成的?如果lsof不存在,有没有办法查看grep当前正在处理哪个文件?我可以在 Debian 下使用lsof,看起来有问题的文件名是“0xc6b2c230 文件结构,ty=0,op=0xc0d34120”。我不确定这是什么。我无法在 FreeBSD 下使用lsof或fstat。
PS:我知道我可以使用find实用程序,但这不是问题所在。
在 Linux 上,
lsof
您可以列出/proc/$(pgrep grep)/fd
. 您应该看到该进程的每个打开文件描述符的符号链接,它将指向它对应的文件。以下是这对我所做的示例: