Grep:/proc / sysrq-триггер: ошибка ввода / вывода
Я ищу файловую систему и использую grep. Я вижу, что все работает, пока не появится эта ошибка:
Grep: /proc/sysrq-trigger: Input/output error
Я нашел информацию в разных местах сети, где другие столкнулись с той же проблемой, но нигде на самом деле не было ничего, что работало. Я попробовал 2>/dev / null, который подавил ошибку, но не "пропустил файл", который на самом деле я надеялся, что он будет делать. Вместо этого он просто останавливает процесс (который является процессом поиска/sed, использующим grep). Я думаю, есть способ указать файлы для исключения с помощью grep, но я надеюсь, что может быть более надежное и элегантное решение.
2 ответов
похоже, что вы рекурсивно просматриваете всю иерархию файловой системы. Это не будет работать так, как ожидалось в большинстве систем.
на Linux по крайней мере /proc
и /sys
являются виртуальными файловыми системами - они не соответствуют фактическому файлу на диске. Специальные файлы в /dev
также не являются фактическими файлами - они соответствуют некоторым устройствам в вашей системе, таким как жесткие диски, устройства ввода e.т. 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
вы можете использовать столько -path
и/или -prune
параметры, как вам нужно настроить выход find
. Однако я рекомендую вам проверить его выход, прежде чем передавать его на любой из более поздних этапов конвейера.
EDIT:
вот несколько примеров ущерба, причиненного при доступе к определенным файлам неконтролируемым образом-обычно как root
:
старых ядрах используется для аварии если
/proc/kcore
читать какroot
. Я считаю, что этого больше не происходит, но я столкнулся с этим с тех пор/proc/kcore
был представлен в 2.4.ядра серии X и иногда всплывает снова, поэтому я не в настроении его тестировать...чтение блочного устройства через его узел устройства в
/dev/
может сильно замедлить любую другую операцию на этом устройстве, так как он обходит VFS и различные кэши. Представьте себе, например, чтение части 6TB RAID-5 напрямую, в то время как другие процессы пытаются использовать ее должным образом через установленную файловую систему. Используя-type f
наfind
должно предотвратить это.поскольку вы упомянули модификацию, вы можете легко заблокировать встроенное устройство, повредив его прошивку, которая доступна через
/dev/mtd*
. В некоторых случаях невозможно оправиться от такой коррупции без некоторых довольно крайних мер.
grep имеет параметр --exclude-dir=dir, который можно использовать, чтобы избежать /proc и / sys
недавно я использовал такую команду, где я знал только имя параметра, который я ожидал найти в каком-то конфигурационном файле, но не имел понятия о пути файла.
cd / && grep -rI --exclude-dir=proc --exclude-dir=sys pattern *