【发布时间】:2014-07-03 13:10:35
【问题描述】:
我尝试在 Linux 中使用 rm -rf file_name 删除文件,但收到错误:
rm: file_name not removed. Text file busy
我怎样才能知道哪个进程正在使用这个文件?
【问题讨论】:
我尝试在 Linux 中使用 rm -rf file_name 删除文件,但收到错误:
rm: file_name not removed. Text file busy
我怎样才能知道哪个进程正在使用这个文件?
【问题讨论】:
你可以使用fuser命令,比如:
fuser file_name
您将收到使用该文件的进程列表。
您可以使用不同的标志,以获得更详细的输出。
您可以在fuser's Wikipedia article 或man 页面中找到更多信息。
【讨论】:
fuser 实现都是相同的,或者工作方式相同。即使-i 是在 POSIX 中定义的,您使用的特定实现也不一定具有与 Wikipedia 文章中描述的选项相同的选项。比如我现在用的是AIX,这个系统中可用的fuser也没有-i选项。
fuser 和 lsof 都没有在 virtualbox 客户机上为我工作。 This answer救了我。
@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 找出哪些进程正在使用特定的套接字。一个很好的工具,可以放在你的武器库中。
【讨论】:
lsof | head -1 查看所有标题。
lsof | grep -E "PID|<your_process_name>" 显示第一行和您要查询的进程。
对于没有 fuser 的用户:
虽然我们可以使用 lsof,但还有另一种方法,即我们可以查询 /proc 文件系统本身,该文件系统列出了所有进程打开的所有文件。
# ls -l /proc/*/fd/* | grep filename
下面的示例输出:
l-wx------。 1 根 64 Aug 15 02:56 /proc/5026/fd/4 -> /var/log/filename.log
从输出中,可以使用 ps 等实用程序中的进程 ID 来查找程序名称
【讨论】:
【讨论】:
tree 是否从标准输入读取任何内容?如果是,它对那个输入有什么作用?
tree,而不是lsof。据我了解,tree 不会从标准输入读取,因此当您运行lsof | tree ... 时,lsof 的输出会丢弃。如果正确,那么lsof | tree MyFold 与tree MyFold 相同,只是显示内容,而不是某个进程打开了哪些文件。