Como posso imprimir nomes de arquivos no comando linux se souber seu descritor de arquivo de um arquivo aberto por um processo?

4

Eu conheço o descritor de arquivo de um arquivo aberto por um processo, mas não sei o ID do processo. Como posso imprimir nomes de arquivos no prompt de comando do Linux se eu souber o descritor de arquivo de um arquivo aberto por um processo?

    
por techfun 12.02.2014 / 20:39

2 respostas

3

Se você não souber o ID do processo, terá que verificar todos processos que tenham o mesmo fd # aberto, já que os descritores de arquivos não globalmente único. Quanto menor for o fd #, mais processos o abrirão (por exemplo, no meu sistema, mesmo que o fd # tenha cerca de 30, eu ainda precisaria adivinhar entre 15 processos, e se eu estivesse procurando pelo fd # em torno de 10, então a lista teria ~ 170 processos).

O sistema de arquivos proc mostra os descritores de arquivos como links simbólicos em /proc/<pid>/fd .

# ls -l /proc/1/fd
lrwx------ 1 root root 64 Feb 12 22:10 /proc/1/fd/0 -> /dev/null
lrwx------ 1 root root 64 Feb 12 22:10 /proc/1/fd/1 -> /dev/null
lrwx------ 1 root root 64 Feb 12 22:10 /proc/1/fd/2 -> /dev/null
l-wx------ 1 root root 64 Feb 12 22:10 /proc/1/fd/3 -> /dev/kmsg
lrwx------ 1 root root 64 Feb 12 22:10 /proc/1/fd/4 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Feb 12 22:10 /proc/1/fd/5 -> anon_inode:[signalfd]
lr-x------ 1 root root 64 Feb 12 22:10 /proc/1/fd/6 -> /sys/fs/cgroup/systemd/
...etc...

Por exemplo, para procurar o fd # 5 em todos os processos:

# ls -l /proc/*/fd/5
lrwx------ 1 root    root    64 Feb 12 22:10 /proc/1/fd/5 -> anon_inode:[signalfd]
lrwx------ 1 root    root    64 Feb 12 22:15 /proc/129/fd/5 -> socket:[6980]
lrwx------ 1 root    root    64 Feb 12 22:15 /proc/168/fd/5 -> socket:[7847]
lrwx------ 1 root    root    64 Feb 12 22:15 /proc/341/fd/5 -> anon_inode:[eventfd]
lr-x------ 1 root    root    64 Feb 12 22:15 /proc/342/fd/5 -> anon_inode:inotify
...etc...

A interface exata para resolver destinos de links simbólicos é readlink() :

# readlink /proc/427529/fd/7
/home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp
    
por 12.02.2014 / 21:14
1

Do lsof manpage :

To find the process that has /u/abe/foo open, use:

lsof /u/abe/foo

Veja também este tutorial sobre lsof ans estas dicas sobre lsof

    
por 12.02.2014 / 21:02