
たとえば、プログラムがあり、そのファイルシステムのアクティビティ (どのファイル/ディレクトリが作成/変更/削除されたかなど) を監視したいとします。このプログラムはさらにプロセスを生成することができる可能性があるため、生成されたプロセスのアクティビティも取得したいと考えています。
これをどうやってやればいいのでしょうか?
答え1
使用できますstrace
このために:
strace -f -e trace=file command args...
strace
システム コールをトレースし、発生したときにその説明を標準エラーに出力します。 この-f
オプションは、子プロセスとスレッドも追跡するように指示します。-e
追跡する呼び出しを変更できます。 は、、など-e trace=file
のすべての使用をログに記録しますが、ファイル以外のアクションは記録しません。open
unlink
ファイルから読み取られた内容とファイルに書き込まれた内容を確認したい場合は、代わりに に変更します-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
基盤となっているものです。