Я использовал следующий шаблон поиска grep на нескольких платформах:
grep -r -I -D skip 'string_to_match' /
Например на FreeBSD 8.0, FreeBSD 6.4 и Debian 6.0(сжать). Команда выполняет рекурсивный поиск, начиная с корневого каталога, предполагает, что двоичные файлы не имеют '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: Устройство занято". После этого grep просто бездействует, поскольку в соответствии с "top -m io -o total" использование ввода / вывода grep не выполняется. Такое же поведение верно под FreeBSD 8.0, но последняя информация, отправленная на stderr, "grep: /tmp/.wine-0: Permission denied" на моей установке. В случае Debian последний вывод на stderr: "grep: / proc / sysrq-trigger: ошибка ввода / вывода". Если я проверю использование ввода-вывода процесса 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: Я знаю, что могу использовать найти утилита, но вопрос не в этом.
В 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