web-dev-qa-db-ja.com

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

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

これを行うにはどうすればよいですか?

6
user2064000

これには 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} ---

-o filenameを使用してターミナルの代わりにファイルにログを記録し、-vを使用して出力を(さらに)より詳細にすることができます。必要に応じて、-p PIDを使用して既存のプロセスにアタッチすることもできます。

自分で調べるのではなく、プログラムでこれを行う場合は、ptraceが構築されている strace call を確認してください。

7
Michael Homer