2012-02-26 13 views
9

Estoy buscando un sistema de archivos y estoy utilizando grep. Veo que todo está funcionando hasta que aparezca este error:Grep:/proc/sysrq-trigger: Error de entrada/salida

Grep: /proc/sysrq-trigger: Input/output error 

he encontrado información en varios lugares en la red donde otros han llegado al otro lado del mismo problema, pero en ninguna parte fue realmente hay algo que funcionó. Probé 2>/dev/null que suprimió el error pero no "saltó el archivo", que es realmente lo que esperaba que hiciera. En cambio, simplemente detiene el proceso (que es un proceso find/sed que utiliza grep). Creo que hay una manera de especificar archivos para exclusión usando grep, pero espero que haya una solución más robusta y elegante.

+0

Así que use 'find $ whatever! -wholename "/ proc/sysrq-trigger" '? –

+0

* ¿Por qué * estás leyendo archivos recursivamente en '/ proc' en absoluto? Es posible que podamos ayudarle más si nos dice lo que está tratando de hacer en términos más amplios. – thkala

+0

@thkala tratando de buscar archivos con una cierta cadena y luego eliminar todo el contenido del archivo. – user1166981

Respuesta

16

Parece que está buscando de forma recursiva toda la jerarquía del sistema de archivos. Eso no funcionará como se espera en la mayoría de los sistemas.

En Linux al menos /proc y /sys son sistemas de archivos virtuales - no corresponden a un archivo real en el disco. Los archivos especiales en /dev tampoco son archivos reales: corresponden a algunos de los dispositivos en su sistema, como discos duros, dispositivos de entrada e.t.c. Modificar -y, ocasionalmente, incluso leer- archivos bajo cualquiera de estos directorios nunca debería suceder de manera descontrolada, ya que puede bloquear el kernel, arruinar sus sistemas de archivos e incluso causar daños permanentes a su hardware.

dado que está utilizando find para realizar la búsqueda, es necesario restringir el alcance de su búsqueda:

  • uso explícito negado -path opciones:

    find/-maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*' 
    
  • utilizar la opción -prune:

    find/-maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print 
    
  • Utilice la opción -xdev para evitar descender a otros sistemas de ficheros por completo:

    find/-maxdepth 2 -xdev -type f 
    

se puede utilizar como muchos -path y/o -prune opciones como sea necesario para ajustar la salida de find. Sin embargo, recomiendo que inspeccione su salida antes de pasarla a cualquiera de las etapas posteriores de la tubería.

EDIT:

Éstos son algunos ejemplos de los daños causados ​​al acceder a ciertos archivos de una manera incontrolada - por lo general como root:

  • kernels antiguos used to crash si /proc/kcore se leyó como root. Creo que esto ya no sucede, pero me he encontrado con este puesto /proc/kcore se introdujo en la serie 2.4.x del kernel y occasionally pops up again, así que estoy de humor para realmente probarlo ...

  • Lectura de un dispositivo de bloques a través de su nodo de dispositivo en /dev/ puede ralentizar severamente cualquier otra operación en ese dispositivo, ya que evita el VFS y varios cachés.Imagine, por ejemplo, leer una partición de 6TB RAID-5 directamente, mientras que otros procesos intentan usarla correctamente a través del sistema de archivos instalado. El uso de -type f en find debe evitar que esto suceda.

  • Como mencionó la modificación, puede bloquear fácilmente un dispositivo incrustado al dañar su firmware, al que se puede acceder a través del /dev/mtd*. En algunos casos es imposible recuperarse de dicha corrupción sin algunas medidas bastante extremas.

+0

Veo, no tenía idea de que podría dañarlo simplemente leyendo el archivo. ¿Supongo que esto se debe quizás al bloqueo de acceso de otros procesos importantes? Gracias por la respuesta detallada, muy apreciada. ¿Podría encadenar más caminos excluidos juntos, por ejemplo? -path '/ proc/*! -path '/ sys/*' etc.? – user1166981

+0

1. * Hay * algunos archivos que históricamente han causado problemas cuando se leen como root. Uno de mis viejos sistemas solía colgarse cuando se leía '/ proc/kcore', y sería bastante * molesto * si algo intentaba leer mi dispositivo RAID array directamente (aunque' -type f' debería protegerlo al menos) – thkala

+0

2. No solo está leyendo, mencionó una modificación. Ahora 'sed -i' normalmente escribe en un archivo temporal antes de reemplazar el original, que protege los archivos no recuperables, pero cualquier otro método podría haber modificado fácilmente el original, causando un * lote * de daños. – thkala

5

grep tiene una opción = dir --exclude-dir que se puede utilizar para evitar/proc y/sys

utilicé una orden como la recientemente donde sólo conocía el nombre de un parámetro que Esperaba estar en algún archivo de configuración, pero no tenía ni idea sobre la ruta del archivo.

cd/&& grep -rI --exclude-dir=proc --exclude-dir=sys pattern * 
Cuestiones relacionadas