如何确定哪个进程正在创建文件?

Ant*_*sky 72 process monitoring files

给定文件路径,我如何确定哪个进程创建它(和/或读/写)?

Gil*_*il' 92

lsof的命令(在几个答案已经提到过)会告诉你哪个进程在你运行它的时候打开一个文件。lsof几乎适用于所有 Unix 变体。

lsof /path/to/file
Run Code Online (Sandbox Code Playgroud)

lsof不会告诉您两微秒前打开并一微秒前关闭的文件。如果您需要查看特定文件并在访问时做出反应,则需要不同的工具。

如果您可以提前一点计划,您可以将文件放在LoggedFS文件系统上。LoggedFS 是一个FUSE堆栈文件系统,它记录对层次结构中文件的所有访问。日志参数是高度可配置的。FUSE 适用于所有主要的 unice。您需要记录对创建文件的目录的访问。从提供的示例配置文件开始,并根据本指南进行调整。

loggedfs -l /path/to/log_file -c /path/to/config.xml /path/to/directory
tail -f /path/to/log_file
Run Code Online (Sandbox Code Playgroud)

许多 unice 提供其他监控设施。在 Linux 下,您可以使用相对较新的 审计子系统。关于它的文献并不多(但不仅仅是关于loggedfs);你可以开始这个教程一个 例子,或只是与auditctl手册页。在这里,应该足以确保守护进程已启动,然后运行auditctl

auditctl -w /path/to/file
Run Code Online (Sandbox Code Playgroud)

(我认为旧系统需要auditctl -a exit,always -w /path/to/file)并观看/var/log/audit/audit.log.


小智 14

好吧,您可以lsof重复运行,如果幸运的话,罪魁祸首会将文件打开足够长的时间以使其显示。IE。:

$ lsof -r1 /path/to/file
Run Code Online (Sandbox Code Playgroud)

或许多文件

$ lsof -r1 /path/to/folder/*
Run Code Online (Sandbox Code Playgroud)

这将列出在某个时间点对给定路径的所有访问,每秒一次。这包括列出访问文件的进程的 PID。

如果这样不行,也就是文件打开和关闭都很快,这种情况经常发生,我相信你需要寻找更精细的工具。也许loggedfs可能是什么?

Hackland
如果每秒一次lsof不起作用,您当然可以破解一个尽可能快地重复运行 lsof 的 while 循环。喜欢:

$ while true; do lsof /paht/to/file; done;
Run Code Online (Sandbox Code Playgroud)

不漂亮,但谁知道呢,可能会这样做。

  • 建议在无论如何都不能给出正确答案的工具上运行 `while true` 并不是帮助新 unix 用户的好方法。有更好的方法来触发文件创建操作(请参阅“inotifywait”)和更好的审计文件系统访问的方法(请参阅 [Gilles 回答](http://unix.stackexchange.com/questions/13776/determine-哪个进程正在创建文件/13791#13791))。 (2认同)

归档时间:

查看次数:

130528 次

最近记录:

9 年,3 月 前