2012-02-26 14 views
9

Sto cercando un file system e utilizzando grep. Vedo che tutto funziona fino a visualizzare questo errore:Grep:/proc/sysrq-trigger: errore di input/output

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

ho trovato informazioni in vari luoghi sulla rete in cui altri sono venuti dall'altra parte lo stesso problema, ma da nessuna parte in realtà c'era qualcosa che ha funzionato. Ho provato 2>/dev/null che ha soppresso l'errore ma non 'salta il file' che è davvero quello che speravo avrebbe fatto. Invece interrompe semplicemente il processo (che è un processo di ricerca/scarica che utilizza grep). Penso che ci sia un modo per specificare i file per l'esclusione usando grep, ma spero che ci possa essere una soluzione più robusta ed elegante.

+0

Quindi usare 'trova $ qualunque! -wholename "/ proc/sysrq-trigger" '? –

+0

* Perché * stai leggendo i file in modo ricorsivo in '/ proc'? Potremmo essere in grado di aiutarti di più se ci dicessi cosa stai cercando di fare in termini più ampi. – thkala

+0

@thkala prova a cercare i file con una determinata stringa, quindi elimina l'intero contenuto del file. – user1166981

risposta

16

Sembra che si stia ricorsivamente cercando l'intera gerarchia del filesystem. Ciò non funzionerà come previsto sulla maggior parte dei sistemi.

Su Linux almeno /proc e /sys sono file system virtuali - non corrispondono a un file reale su disco. Anche i file speciali in /dev non sono file effettivi: corrispondono ad alcuni dispositivi sul sistema, ad esempio dischi rigidi, dispositivi di input e.t.c. Modificare - e, occasionalmente, anche leggere - i file sotto una di queste directory non dovrebbero mai accadere in modo incontrollato, dal momento che puoi mandare in crash il kernel, rovinare il tuo filesystem e persino causare danni permanenti all'hardware.

Dal momento che si sta utilizzando find per eseguire la ricerca, è necessario limitare l'ambito della sua ricerca:

  • uso esplicito negato -path opzioni:

    find/-maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*' 
    
  • utilizzare l'opzione -prune:

    find/-maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print 
    
  • Utilizzare l'opzione -xdev per evitare di scendere ad altri filesystem completamente:

    find/-maxdepth 2 -xdev -type f 
    

è possibile utilizzare come molti -path e/o -prune opzioni di cui hai bisogno per mettere a punto l'uscita di find. Raccomando, tuttavia, di ispezionare la sua uscita prima di passarla a uno degli stadi successivi della pipeline.

EDIT:

Ecco alcuni esempi di danni causati durante l'accesso di alcuni file in maniera incontrollata - di solito come root:

  • più vecchio kernel used to crash se /proc/kcore è stato letto come root. Credo che questo non accade più, ma ho incontrato questo dato /proc/kcore è stato introdotto nella serie 2.4.x del kernel e occasionally pops up again, quindi sono in vena di provare in realtà ...

  • La lettura di un dispositivo a blocchi tramite il suo nodo di dispositivo in /dev/ può rallentare gravemente qualsiasi altra operazione su quel dispositivo, poiché ignora VFS e varie cache.Immaginate, per esempio, di leggere direttamente una parata RAID-5 da 6 TB, mentre altri processi tentano di usarlo correttamente tramite il filesystem installato. L'utilizzo di -type f in find dovrebbe impedire che ciò accada.

  • Dato che hai menzionato la modifica, potresti facilmente brickare un dispositivo incorporato danneggiando il suo firmware, che è accessibile tramite /dev/mtd*. In alcuni casi è impossibile recuperare da tale corruzione senza misure piuttosto estreme.

+0

Vedo, non avevo idea che potessi danneggiarlo semplicemente leggendo il file, immagino che ciò sia dovuto forse al blocco dell'accesso da altri importanti processi? Grazie per la risposta dettagliata, molto apprezzata. Ad esempio, potrei associare più percorsi esclusi! -path '/ proc/*! -path '/ sys/*' etc? – user1166981

+0

1. Ci * sono * alcuni file che storicamente hanno causato problemi quando letti come root. Uno dei miei vecchi sistemi ha usato il crash quando '/ proc/kcore' è stato letto - e sarebbe piuttosto * fastidioso * se qualcosa tentasse di leggere il mio dispositivo RAID direttamente (anche se' -type f' dovrebbe proteggerlo almeno) – thkala

+0

2. Non stai solo leggendo, hai menzionato la modifica. Ora 'sed -i' normalmente scrive su un file temporaneo prima di sostituire l'originale, che protegge i file non cancellabili, ma qualsiasi altro metodo potrebbe aver facilmente modificato l'originale causando un * lotto * di danno. – thkala

5

grep ha un'opzione = dir --exclude-dir che è possibile utilizzare per evitare/proc e/sys

ho usato un comando come questo di recente in cui conoscevo solo il nome di un parametro che Mi aspettavo di essere in qualche file di configurazione, ma non avevo idea del percorso del file.

cd/&& grep -rI --exclude-dir=proc --exclude-dir=sys pattern * 
Problemi correlati