假设我有一个程序,我想监视它的文件系统活动(创建/修改/删除了哪些文件/目录等)。该程序可能能够生成更多进程,因此,我想获取以下活动:这些衍生的进程也是如此。
我该怎么做呢?
答案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
在跟踪的 shell 中运行):
[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
构建的基础。