Рекурсивный grep начался в / висит

Я использовал следующую схему поиска 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 для ввода-вывода отсутствует. То же самое верно для FreeBSD 8.0, но последняя информация, отправляемая в stderr, - это "grep: /tmp/.wine-0: В доступе отказано" в моей установке. В случае Debian последним выводом в stderr будет "grep: / proc / sysrq-trigger: Input / output error". Если я проверю использование ввода-вывода процесса grep в Debian, оно будет следующим:

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:~#

Что может вызвать это? Есть ли способ посмотреть, какой файл grep в настоящее время обрабатывается, если lsof отсутствует? Я могу использовать lsof под Debian и похоже, что проблемное имя файла есть "0xc6b2c230 file struct, ty=0, op=0xc0d34120". Я не уверен, что это.. Я не могу использовать lsof или fstat под FreeBSD.

PS: я знаю, что могу использовать утилиту поиска, но это не вопрос.

1 ответ

Решение

В Linux вместо lsof Вы можете перечислить содержимое /proc/$(pgrep grep)/fd, Вы должны увидеть символическую ссылку для каждого дескриптора открытого файла для этого процесса, и он укажет на файл, которому он соответствует. Вот пример того, что это сделало для меня:

$ ls -gG /proc/$(pgrep grep)/fd
total 0
lrwx------ 1 64 Oct 18 19:39 0 -> /dev/pts/2
lrwx------ 1 64 Oct 18 19:39 1 -> /dev/pts/2
lrwx------ 1 64 Oct 18 19:39 2 -> /dev/pts/2
lr-x------ 1 64 Oct 18 19:39 3 -> /usr/share/groff/1.18.1.4/font/devdvi/generate/texb.map
Другие вопросы по тегам