Я знаю файловый дескриптор файла, открытого процессом, но я не знаю идентификатор процесса. Как можно распечатать имена файлов из командной строки Linux, если я знаю дескриптор файла, открытого процессом?
2 ответа
Если вы не знаете идентификатор процесса, вам придется проверить все процессы с одинаковым открытым fd #, поскольку файловые дескрипторы не являются глобально уникальными. Чем меньше fd #, тем больше процессов будет его открывать (например, в моей системе, даже если fd # составляет около 30, мне все равно нужно угадать между 15 процессами, и если бы я искал fd # около 10, тогда в списке будет ~ 170 процессов).
Файловая система proc показывает файловые дескрипторы в виде символических ссылок в /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...
Например, чтобы найти fd # 5 во всех процессах:
# 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...
Точный интерфейс для разрешения целей символической ссылки - readlink()
:
# readlink /proc/427529/fd/7 /home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp
Чтобы найти процесс, в котором открыт файл /u /abe /foo, используйте:
lsof /u/abe/foo
Смотрите также этот урок на lsof
и эти советы на lsof