Как я могу напечатать имена файлов в команде linux, если знаю ее файловый дескриптор файла, открытого процессом?

3177
techfun

Я знаю файловый дескриптор файла, открытого процессом, но я не знаю идентификатор процесса. Как можно распечатать имена файлов из командной строки Linux, если я знаю дескриптор файла, открытого процессом?

4
@tohuwawohu Это список файлов, использующих идентификаторы процессов. Здесь в этом случае у меня нет идентификатора процесса только файл decriptor techfun 10 лет назад 0
ах, хорошо, извините, не понял этого. Так что вы правы, это не обман. tohuwawohu 10 лет назад 0

2 ответа на вопрос

3
grawity

If you do not know the process ID, you will have to check all processes that have the same fd# open, since file descriptors are not globally unique. The smaller the fd#, the more processes will have it open (e.g. on my system, even if the fd# is around 30, I'd still need to guess between 15 processes, and if I was looking for fd# around 10, then the list would have ~170 processes).

The proc filesystem shows the file descriptors as symlinks under /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... 

For example, to look for fd #5 in all processes:

# 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... 

The exact interface to resolve symlink targets is readlink():

# readlink /proc/427529/fd/7 /home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp 
Очень хороший ответ! Теперь даже я понимаю, что происходит :-) tohuwawohu 10 лет назад 0
1
tohuwawohu

From the lsof manpage:

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

lsof /u/abe/foo

See also this tutorial on lsof ans these hints on lsof

Спасибо за ответ. Но на самом деле. Я не знаю в этом случае "/ u / able / foo file". Доступен только дескриптор файла techfun 10 лет назад 0
Не могли бы вы привести пример? tohuwawohu 10 лет назад 0
Я знаю файловый дескриптор (целое число), открытый случайным процессом, который запускается на сервере. Он остается открытым после вызова процесса. Мне нужно знать путь к файлу. techfun 10 лет назад 0
Извините, я полностью сбит с толку. [Этот ответ] (http://superuser.com/a/716010/84724) рассказывает, как получить все имена файлов, включая путь, если вы знаете процесс. Таким образом, либо вы знаете файл для проверки, затем мой ответ применяется, либо вы знаете процесс, тогда применяется связанный ответ. Я просто не вижу, чего не хватает :-( tohuwawohu 10 лет назад 1
Я думаю, что * есть * какое-то заклинание `lsof`, которое перечисляет определенный fd # во всех процессах, но я понятия не имею, как это выглядит. grawity 10 лет назад 0

Похожие вопросы