Почему grep зависает при работе с каталогом /? - PullRequest
5 голосов
/ 01 ноября 2011

Мой вопрос состоит из двух частей:

1) Почему grep зависает, когда я grep все файлы в "/"?

например:

grep -r 'h' ./

(примечание: прямо перед зависанием / сбоем замечу, что вижу сообщения "нет такого устройства или адреса", касающиеся сокетов ...

Конечно, я знаю, что grep не должен работать с сокетом, но я думаю, что поскольку сокеты - это просто файлы в Unix, они должны возвращать отрицательный результат, а не сбой.

2) Теперь мой следующий вопрос: в любом случае - как я могу выполнить grep всей файловой системы? Существуют ли определенные каталоги * NIX, которые мы должны оставить при этом? В частности, я ищу все недавно написанные файлы журналов.

Ответы [ 3 ]

16 голосов
/ 02 ноября 2011

Как сказал @ninjalj, если вы не используете -D skip, grep попытается прочитать все файлы вашего устройства, файлы сокетов и файлы FIFO. В частности, в системе Linux (и многих системах Unix) она будет пытаться прочитать /dev/zero, что кажется бесконечно длинным.

Вы будете ждать некоторое время.

Если вы ищете системный журнал, возможно, наилучшим подходом будет, начиная с /var/log.

Если вы ищете что-то, что действительно может быть где-то в вашей файловой системе, вы можете сделать что-то вроде этого:

find / -xdev -type f -print0 | xargs -0 grep -H pattern

Аргумент -xdev для find указывает ему оставаться в одной файловой системе; это позволит избежать /proc и /dev (а также любых смонтированных файловых систем). -type f ограничивает поиск обычными файлами. -print0 печатает имена файлов, разделенные нулевыми символами, а не символами новой строки; это позволяет избежать проблем с файлами, в именах которых есть пробелы или другие забавные символы.

xargs считывает список имен файлов (или чего-либо еще) на своем стандартном входе и вызывает указанную команду для всего списка. Опция -0 работает с find -print0.

Параметр -H для grep указывает префикс каждого совпадения с именем файла. По умолчанию grep делает это, только если в его командной строке есть два или более имен файлов. Поскольку xargs разбивает свои аргументы на пакеты, вполне возможно, что последний пакет будет иметь только один файл, что даст вам противоречивые результаты.

Попробуйте использовать find ... -name '*.log', чтобы ограничить поиск файлами с именами, заканчивающимися на .log (при условии, что ваши файлы журнала имеют такие имена), и / или используя grep -I ... для пропуска двоичных файлов.

Обратите внимание, что все это зависит от особенностей GNU. Некоторые из этих параметров могут быть недоступны в MacOS (которая основана на BSD) или в других системах Unix. Обратитесь к местной документации и рассмотрите возможность установки GNU findutils (для find и xargs) и / или GNU grep.

Прежде чем пытаться что-либо из этого, используйте df, чтобы увидеть насколько велика ваша корневая файловая система. Мой в настоящее время 268 гигабайт; поиск всего этого, вероятно, займет несколько часов. Несколько минут, потраченных (а) на ограничение файлов, которые вы ищете, и (б) на то, что команда верна, будут стоить затраченного вами времени.

9 голосов
/ 01 ноября 2011

По умолчанию grep пытается прочитать каждый файл. Используйте -D skip для пропуска файлов устройств, файлов сокетов и файлов FIFO.

1 голос
/ 01 ноября 2011

Если вы продолжаете видеть сообщения об ошибках, то grep не зависает. Держите iotop открытым во втором окне, чтобы увидеть, насколько усердно работает ваша система, чтобы вытаскивать все содержимого со своего носителя в основную память, по частям. Эта операция должна быть медленной, или у вас очень скромная система.

Теперь мой следующий вопрос: в любом случае - как я могу выполнить grep всей файловой системы? Существуют ли определенные каталоги * NIX, которые мы должны оставить при этом? В частности, я ищу все недавно написанные файлы журналов.

Срыв всей FS очень редко хорошая идея. Попробуйте найти каталог, в который должны быть записаны файлы журнала; скорее всего /var/log. Еще лучше, если вы знаете что-либо об именах файлов, которые вы ищете (скажем, они имеют расширение .log), затем выполните find или locate и grep файлы, сообщенные этими программами. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...