是否可以找出哪个程序或脚本创建了给定文件?

是否可以找出哪个程序或脚本创建了给定文件?

我的主目录中突然出现了三个文件,名为“client_state.xml”、“lockfile”和“time_stats_log”。最后两个是空的。我很好奇他们是怎么到那里的。这不是第一次发生,但上一次是几周前;我删除了这些文件,没有任何损坏或抱怨。我无法想起当时我在做什么stat $filename。有什么办法可以查到它们来自哪里吗?

或者,有没有办法监视主目录(但不监视子目录)的文件创建情况?

答案1

您可以通过访问文件系统来观察文件系统上发生的一切记录文件系统。这是一个堆叠文件系统记录目录树中的每次访问。

loggedfs -l /var/tmp/$USER-home-fs.log ~

不过,记录整个主目录可能会降低系统速度。你至少会想写一个配置文件并经过严格的过滤。

如果您有 root 访问权限,在 Linux 上,您可以使用审计子系统记录大量内容,包括文件系统访问。确保auditd守护进程已启动,然后配置您要记录的内容auditctl。每个记录的操作都记录在/var/log/audit/audit.log(在典型的发行版上)中。要开始观看特定文件:

auditctl -w /path/to/file

或长形式

auditctl -a exit,always -F path=/path/to/file

如果您对目录进行监视(使用-w-F dir=),则也会递归地监视该目录及其子目录中的文件。

答案2

我不相信有一种方法可以确定哪个程序创建了一份文件。

对于你的替代问题:你不过,请注意使用inotify.inotifywait是子系统的命令行界面inotify;您可以告诉它create在您的主目录中查找事件:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

您可能想使用-m(monitor) 运行它,这告诉它在看到第一个事件后不要退出

答案3

我知道这是一个老问题,但我会建议另一种方法,以防有人发现它有用。我最初发布此内容是为了回答一个被欺骗的问题。

一种选择是使用sysdig:开源系统监控应用程序。使用它,您可以按名称监视文件的活动。假设您想查看哪个进程正在创建名为 的文件/tmp/example.txt

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

从该输出中,您可以看到名为 pid 5470 的进程touch打开了该文件。

如果您想要更多信息,您可以在收集系统调用跟踪的“捕获模式”下运行:

# sysdig -w /tmp/dumpfile.scap

然后等待文件被创建,然后停止sysdig并运行:

# csysdig -r /tmp/dumpfile.scap

这样您就可以探索发生的一切。您可以按下<F2>并选择Files,按下<F4>搜索文件名,然后按下<F6>“dig”(它将显示类似于上述命令的输出)。这样,您就可以使用相同的方法查找有关实际创建该文件的过程的信息。

如果您更喜欢的话,有一个csysdig名为的 GUI 版本。sysdig-inspect

答案4

您还没有,inotify所以您可以编写一个脚本来循环检查文件:

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done

相关内容