ファイルシステムのアクティビティの監視

ファイルシステムのアクティビティの監視

たとえば、プログラムがあり、そのファイルシステムのアクティビティ (どのファイル/ディレクトリが作成/変更/削除されたかなど) を監視したいとします。このプログラムはさらにプロセスを生成することができる可能性があるため、生成されたプロセスのアクティビティも取得したいと考えています。

これをどうやってやればいいのでしょうか?

答え1

使用できますstraceこのために:

strace -f -e trace=file command args...

straceシステム コールをトレースし、発生したときにその説明を標準エラーに出力します。 この-fオプションは、子プロセスとスレッドも追跡するように指示します。-e追跡する呼び出しを変更できます。 は、、など-e trace=fileのすべての使用をログに記録しますが、ファイル以外のアクションは記録しません。openunlink

ファイルから読み取られた内容とファイルに書き込まれた内容を確認したい場合は、代わりに に変更します-e trace=file,read,write。そこで、調べたい追加の呼び出しもリストできます。その引数を完全に省略すると、すべてのシステム コールが取得されます。

出力は次のようになります (mkdir /tmp/testトレースされたシェルで実行しました)。

[pid  1444] execve("/usr/bin/mkdir", ["mkdir", "/tmp/test4"], [/* 33 vars */]) = 0
[pid  1444] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
[pid  1444] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid  1444] open("/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid  1444] open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[pid  1444] mkdir("/tmp/test", 0777)    = 0
[pid  1444] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1444, si_status=0, si_utime=0, si_stime=0} ---

を使用すると、ターミナルではなくファイルにログを記録し、-v を使用すると出力を (さらに) 冗長にすることができます。また、より便利な場合は、-o filenameを使用して既存のプロセスにアタッチすることもできます。-p PID

これをプログラム的に行う場合は、自分で検査するのではなく、ptrace電話、それがstrace基盤となっているものです。

関連情報