次のように 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 パソコン鳥のブログ
プロセスの環境変数、オープン中のファイル、カレントディレクトリを確認する パソコン鳥のブログ
コメント