プロセスによって開かれたファイルのファイル記述子は知っていますが、プロセスIDはわかりません。プロセスによって開かれたファイルのファイル記述子がわかっている場合、Linuxコマンドプロンプトからファイル名を出力するにはどうすればよいですか?
プロセス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
lsofのマンページ から:
/ u/abe/fooが開いているプロセスを見つけるには、次を使用します。
lsof /u/abe/foo
参照 lsof
に関するこのチュートリアル ans lsof
に関するこれらのヒント