Linux上でアクセスされているファイルをtraceしてみる

  • 33
    Like
  • 0
    Comment
More than 1 year has passed since last update.

背景

PHP初心者がPHPのデバッグをしていて、どのファイルがどんなタイミングで参照されているか知りたかったため。

自分の環境

  • Vagrant上のCentOS 6

一度だけやる準備

straceを導入

$ sudo yum -y install strace

トレースのたびに毎回やる準備

まず httpd のプロセスIDを調べる

$ ps -ef | grep http[d]
root      2394     1  0 Apr14 ?        00:00:17 /usr/sbin/httpd
apache    3984  2394  1 20:34 ?        00:00:00 /usr/sbin/httpd
apache    3985  2394  0 20:34 ?        00:00:00 /usr/sbin/httpd
apache    3986  2394  0 20:34 ?        00:00:00 /usr/sbin/httpd
()

こいつが親プロセス(親PIDが1でUSERがroot)

root      2394     1  0 Apr14 ?        00:00:17 /usr/sbin/httpd

ターミナルでstraceを起動

$ sudo strace -f -p 2394 -e trace=file

別のターミナルで子プロセスを作り直す(説明は省略。 strace の -f オプションを与えている理由に通じている。)

$ sudo service httpd reload
Reloading httpd:

あとはブラウザからapacheに接続すると、ファイルシステムに関するイベントがターミナル1にバンバン流れる。

結果をファイルに書き出したいときは:

$ sudo strace -f -p 2394 -e trace=file -o /tmp/trace.log

詳しくは man strace する

こんなログが取れる

CakePHPが起動していくさま

(略)
4046  stat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  stat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  stat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  getcwd("/", 4095)                 = 2
4046  chdir("/var/www/html/app/webroot") = 0
4046  lstat("/var/www/html/app/webroot/index.php", {st_mode=S_IFREG|0644, st_size=3170, ...}) = 0
4046  lstat("/var/www/html/app/webroot", {st_mode=S_IFDIR|0755, st_size=374, ...}) = 0
4046  lstat("/var/www/html/app", {st_mode=S_IFDIR|0755, st_size=612, ...}) = 0
4046  lstat("/var/www/html", {st_mode=S_IFDIR|0755, st_size=782, ...}) = 0
4046  lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
4046  lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
4046  open("/var/www/html/app/webroot/index.php", O_RDONLY) = 14
4046  lstat("/var/www/html/lib/Cake/bootstrap.php", {st_mode=S_IFREG|0644, st_size=14354, ...}) = 0
4046  lstat("/var/www/html/lib/Cake", {st_mode=S_IFDIR|0755, st_size=782, ...}) = 0
4046  lstat("/var/www/html/lib", {st_mode=S_IFDIR|0755, st_size=102, ...}) = 0
4046  open("/var/www/html/lib/Cake/bootstrap.php", O_RDONLY) = 14
4046  lstat("/var/www/html/lib/Cake/basics.php", {st_mode=S_IFREG|0644, st_size=23183, ...}) = 0
4046  open("/var/www/html/lib/Cake/basics.php", O_RDONLY) = 14
4046  lstat("/var/www/html/lib/Cake/Core/App.php", {st_mode=S_IFREG|0644, st_size=28002, ...}) = 0
4046  lstat("/var/www/html/lib/Cake/Core", {st_mode=S_IFDIR|0755, st_size=204, ...}) = 0
4046  open("/var/www/html/lib/Cake/Core/App.php", O_RDONLY) = 14
(略)

関連

Macの場合はfs_usageを使うのがよいと思う。

http://d.hatena.ne.jp/eco31/20091019/1255960823