如何找出哪个进程正在Linux中使用文件?


91

我尝试使用删除Linux中的文件rm -rf file_name,但出现错误:

rm: file_name not removed.  Text file busy

我如何找出哪个进程正在使用此文件?

Answers:


136

您可以使用以下fuser命令:

fuser file_name

您将收到使用该文件的进程列表。

您可以对其使用不同的标志,以便接收更详细的输出。

您可以在热熔器的Wikipedia文章man页面中找到更多信息。


我尝试过:热熔器-i / home / bin / lib。但是得到了这个:热熔器:非法选项-i / home / bin / lib:27674t
khris 2014年

1
@khris,可能并非所有fuser实现都相同或以相同方式工作。即使-i在POSIX中定义了,您所使用的特定实现也不一定具有与Wikipedia文章中所述的选项相同的选项。例如,我现在正在使用AIX,并且fuser该系统中的可用-i选项也没有。
jimm-cl 2014年

由于某种原因,在virtualbox访客上既fuser没有lsof为我工作,也没有为我工作。这个答案救了我。
凯尔(Kael)

34

@jim的答案是正确的-fuser这就是您想要的。

另外(或替代地),如果lsof需要权限(而不必运行其他命令)来杀死进程,则可以使用来获取包括用户名在内的更多信息。(尽管,当然,如果您要中止进程,fuser可以使用其-k选项来实现。您可以fuser将其他信号与该-s选项一起使用-有关详细信息,请参见手册页。)

例如,tail -F /etc/passwd在一个窗口中运行:

ghoti@pc:~$ lsof | grep passwd
tail      12470    ghoti    3r      REG  251,0     2037 51515911 /etc/passwd

请注意,您还可以使用lsof找出正在使用特定套接字的进程。武器库中的绝佳工具。


PID是哪个字段?
nmz787

@ nmz787-lsof | head -1查看所有标题。
ghoti

@ nmz787第二个字段是PID。
:l,

lsof | grep -E "PID|<your_process_name>"同时显示第一行和您要查询的过程。
罗宾·许

0
$ lsof | tree MyFold

如所附图片所示:

在此处输入图片说明


1
这是如何运作的?是否tree从stdin读取任何内容?如果是,那么该输入有什么作用?
dyp

man lsof –显示命令lsof的手册,lsof –列出打开的文件,在其标准输出文件上列出有关进程打开的文件的信息,结果可以在树形结构中看到。您应该清楚地检查lsof是什么
钝概念

我的问题tree不是lsof。据我了解,tree不会从标准输入中读取内容,因此当您运行时,其输出将lsof丢弃lsof | tree ...。如果正确,则lsof | tree MyFold与相同tree MyFold,后者仅显示内容,而不显示某些进程打开的文件。
dyp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.