Linuxでプロセスがどのファイルにアクセスしているか調べる

ALL
スポンサーリンク

次のように strace を実行します。
PID は、調査したいプロセスIDを指定してください。

strace -p PID 2>&1 | grep -e ^open

例えば次のように実行します。

strace -p 448 2>&1 | grep -e ^open

プロセスがファイルをオープンすると、次のように open で始まる表示が出力されます。
ファイルのパスも表示されています。

open("/var/cache/samba/browse.dat.", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0644) = 26
open("/var/cache/samba/browse.dat.", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0644) = 26

プロセスがファイルを既にオープンしている場合は、straceを実行しても、open のログは現れません。
そこでプロセスの書き込みや読み込み動作を元に調べます。

書き込みを元にする場合は、次のように strace を実行します。
-p 448 の部分は、各自調べたいプロセスIDに置き換えて下さい。

strace -p 448 2>&1 | grep -e ^write

すると、プロセスでのファイル書き込みの際は、write で始まるログが出力されます。

write(26, "\"WORKGROUP\"               c00010"..., 385) = 385
write(26, "\"WORKGROUP\"               c00010"..., 385) = 385

読み込みを元にする場合は、次のように strace を実行します。
-p 7540 の部分は、各自調べたいプロセスIDに置き換えて下さい。
また、末尾に \( を付けるのを忘れないようにしてください。

strace -p 7540 2>&1 | grep -e ^read\(

すると、プロセスでのファイル読み込みの際は、read で始まるログが出力されます。

read(3, "\31\365S\325", 4)              = 4
read(3, "\344\5\241\316", 4)            = 4
read(3, "\"m\337\263", 4)               = 4
read(3, "\350\211\207[", 4)             = 4

しかし、プロセスの読み書きはわかりましたが、このままでは、どのファイルかが不明です。

そこで、read や write の後の数字(ファイルディスクリプタと呼ばれます)を元にファイルを探します。

次の書式でコマンドを実行します。
PID は、調査したいプロセスIDを指定してください。

ls -l /proc/PID/fd/

例えば次のように実行します。

ls -l /proc/448/fd/

すると、ファイルディスクリプタに対するファイル名が表示されます。
下記例では、ファイルディスクリプタ 14 は、/run/samba/serverid.tdb です。

dr-x------ 2 root root  0  9月 16 07:02 .
dr-xr-xr-x 8 root root  0  9月 15 21:20 ..
lrwx------ 1 root root 64  9月 16 07:02 0 -> /dev/null
lrwx------ 1 root root 64  9月 16 07:02 1 -> /dev/null
l-wx------ 1 root root 64  9月 16 07:02 10 -> /run/samba/nmbd.pid
lr-x------ 1 root root 64  9月 16 07:02 11 -> pipe:[12644]
l-wx------ 1 root root 64  9月 16 07:02 12 -> pipe:[12644]
lrwx------ 1 root root 64  9月 16 07:02 13 -> anon_inode:[eventfd]
lrwx------ 1 root root 64  9月 16 07:02 14 -> /run/samba/serverid.tdb
lrwx------ 1 root root 64  9月 16 07:02 15 -> socket:[12646]

これでプロセスがアクセスしているファイルがわかります。

参考

プロセスのシステムコールをトレースする strace パソコン鳥のブログ
プロセスの環境変数、オープン中のファイル、カレントディレクトリを確認する パソコン鳥のブログ

コメント