grep recursivo iniciado em / trava

1

Eu usei o seguinte padrão de pesquisa do grep em várias plataformas:

grep -r -I -D skip 'string_to_match' /

Por exemplo, no FreeBSD 8.0 , FreeBSD 6.4 e Debian 6.0 (squeeze). Comando faz uma busca recursiva a partir do diretório raiz, assume que os arquivos binários não têm o 'string_to_match' e ignora dispositivos, soquetes e pipes nomeados. FreeBSD 8.0 e FreeBSD 6.4 usam o GNU grep versão 2.5.1 e o Debian 6.0 usa o GNU grep versão 2.6.3. No FreeBSD 6.4 , a última informação impressa em stderr era "grep: / dev / cuad0: Dispositivo ocupado" . Após este grep apenas inativo como de acordo com o "top -m io -o total" o uso de E / S do grep é inexistente. O mesmo comportamento é verdadeiro no FreeBSD 8.0 , mas a última informação enviada ao stderr é "grep: /tmp/.wine-0: Permission denied" na minha instalação. No caso do Debian, a última saída para stderr é "grep: / proc / sysrq-trigger: erro de entrada / saída" . Se eu verificar o uso de I / O do processo grep no Debian, ele é o seguinte:

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:~#

O que pode causar isso? Existe uma maneira de ver qual arquivo grep está processando no momento em que lsof não está presente? Eu sou capaz de usar o lsof no Debian e se parece com o nome do arquivo problemático que existe "0xc6b2c230 file struct, ty = 0, op = 0xc0d34120". Eu não tenho certeza do que é isso .. Eu não consigo usar lsof ou fstat no FreeBSD.

PS: Eu sei que eu poderia usar o utilitário find , mas essa não é a questão.

    
por Martin 18.10.2012 / 12:24

1 resposta

1

No Linux, em vez de lsof , você pode listar o conteúdo de /proc/$(pgrep grep)/fd . Você deve ver um symlink para cada descritor de arquivo aberto para esse processo e ele apontará para o arquivo ao qual ele corresponde. Aqui está uma amostra do que isso fez por mim:

$ 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
    
por 18.10.2012 / 12:40