web-dev-qa-db-ja.com

プロセスによって開かれたファイルのファイル記述子がわかっている場合、Linuxコマンドでファイル名を出力するにはどうすればよいですか?

プロセスによって開かれたファイルのファイル記述子は知っていますが、プロセスIDはわかりません。プロセスによって開かれたファイルのファイル記述子がわかっている場合、Linuxコマンドプロンプトからファイル名を出力するにはどうすればよいですか?

5
techfun

プロセスIDがわからない場合は、同じfd#が開いているすべてのプロセスをチェックする必要があります。ファイル記述子はnotグローバルに一意です。 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ルートルート64Feb 12 22:10/proc/1/fd/1->/dev/null 
 lrwx ------ 1ルートルート64 Feb 12 22:10/proc/1/fd/2-> /dev/null
l-wx------1ルートルート64Feb 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ルートルート64Feb 12 22:10/proc/1/fd/5-> anon_inode:[signalfd] 
 lr-x ------ 1ルートルート64Feb 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ルートルート64Feb 12 22:15/proc/129/fd/5->ソケット:[6980] 
 lrwx ----- -1ルートルート64Feb 12 22:15/proc/168/fd/5->ソケット:[7847] 
 lrwx ------ 1ルートルート64Feb 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 
...等...

シンボリックリンクターゲットを解決するための正確なインターフェイスはreadlink()です。

#readlink /proc/427529/fd/7
/home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp
4
user1686

lsofのマンページ から:

/ u/abe/fooが開いているプロセスを見つけるには、次を使用します。

lsof /u/abe/foo

参照 lsofに関するこのチュートリアル ans lsofに関するこれらのヒント

1
tohuwawohu