it-swarm.cn

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

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

67
Anton Barkovsky

lsof命令(已经在几个答案中提到)将告诉您在运行文件时哪个进程打开了文件。 lsof适用于几乎所有的unix变体。

lsof /path/to/file

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

如果可以提前计划,则可以将文件放在LoggedFS文件系统上。 LoggedFS是一个 Fuse 堆叠文件系统,它记录对层次结构中文件的所有访问。日志记录参数是高度可配置的。保险丝可用于 所有主要unices 。您将要记录对文件创建目录的访问。从提供的样本配置文件开始,然后根据 本指南 对其进行调整。

loggedfs -l /path/to/log_file -c /path/to/config.xml /path/to/directory
tail -f /path/to/log_file

许多联合国机构提供其他监测设施。在Linux下,您可以使用相对较新的 审计子系统 。关于它的文献不多(但不止于日志记录的fs)。您可以以 本教程a很少示例 开头,也可以仅以 auditctl手册页 。在这里,足以确保启动了守护程序,然后运行auditctl

auditctl -w /path/to/file

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

86

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

$ lsof -r1 /path/to/file

或许多文件

$ lsof -r1 /path/to/folder/*

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

如果这样不起作用,即文件打开和关闭非常快(通常是这种情况),我相信您需要寻找更精致的工具。也许 loggedfs 可能是什么?

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

$ while true; do lsof /paht/to/file; done;

不漂亮,但谁知道,也许会做到。

11
0scar

您可以为此使用lsof

$ lsof /tmp/file
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
less      4737 wena    4r   REG    8,6    90700 1643536 /tmp/file

它说名为less的进程是保持文件“ / tmp/file”打开。

[〜#〜] note [〜#〜]:奇怪的是,如果我使用geanynano,那是行不通的。期待更好的建议。

1
tshepang

您可以使用lsgrep找出chrome使用的文件

$ ls -l /proc/*/fd | grep "chrome"
lrwx------ 1 ba abc 64 Jul 16 22:19 104 -> /home/abc/.config/google-chrome/Default/Cookies
lr-x------ 1 abc abc 64 Jul 16 22:19 113 -> /opt/google/chrome/nacl_irt_x86_64.nexe
lrwx------ 1 abc abc 64 Jul 16 22:19 121 -> /home/abc/.cache/google-chrome/Default/Cache/data_0
lrwx------ 1 abc abc 64 Jul 16 22:19 122 -> /home/abc/.cache/google-chrome/Default/Cache/data_1
lrwx------ 1 abc abc 64 Jul 16 22:19 123 -> /home/abc/.cache/google-chrome/Default/Cache/data_2
lr-x------ 1 abc abc 64 Jul 16 22:19 125 -> /home/abc/.config/google-chrome/Dictionaries/en-US-3-0.bdic

另一种方法是使用lsofgrep

$ lsof | grep "chrome"
chrome     2204       abc  cwd       DIR                8,5     4096 1441794 /home/abc
chrome     2204       abc  rtd       DIR                8,5     4096       2 /
chrome     2204       abc  txt       REG                8,5 87345336 5111885 /opt/google/chrome/chrome
chrome     2204       abc  mem       REG                8,5  4202496 1443927 /home/abc/.cache/google-chrome/Default/Media Cache/data_3
chrome     2204       abc  mem       REG                8,5  1056768 1443926 /home/abc/.cache/google-chrome/Default/Media Cache/data_2
chrome     2204       abc  mem       REG                8,5   270336 1443925 /home/abc/.cache/google-chrome/Default/Media Cache/data_1
chrome     2204       abc  mem       REG                8,5    45056 1443924 /home/abc/.cache/google-chrome/Default/Media Cache/data_0
0
SRINIVAS KATLA
lsof |grep (filename)

这将向您显示当前正在使用该文件的过程。

0
Matthew