我尝试对文件夹进行rm -rf,并出现“设备或资源繁忙”的情况。

在Windows中,我本可以使用LockHunter来解决此问题。什么是linux等价物? (请给出一个简单的“解锁此”方法的答案,而不是像这样的完整文章。尽管它们很有用,但我目前仅对ASimpleMethodThatWorks™感兴趣)

评论

谢谢,这很方便-我是从Linux到Windows,正在寻找与lsof类似的产品-LockHunter。

我勒个去? Unix不会像Windows一样阻止您删除打开的文件。这就是为什么您可以通过运行rm -rf / ...删除整个系统的原因,它将愉快地删除每个文件,包括/ bin / rm。

@psusi,那是不正确的。您的信息来源很差,或者只是捏造了东西。像Windows一样,Linux具有文件和设备锁定功能。但是,这有点坏。 0pointer.de/blog/projects/locking.html

@foobarbecue,通常这些只是顾问锁,手册页至少似乎表明它们仅用于读/写,而不用于取消链接。

#1 楼

您需要的工具是lsof,它代表列表打开文件。

它有很多选项,因此请查看手册页,但是如果要查看目录下的所有打开文件:

lsof +D /path


这将遍历/path下的文件系统,因此请注意在大型目录树上进行操作。

一旦知道哪些进程打开了文件,您可以退出这些应用,或使用kill(1)命令将其杀死。

评论


如果没有结果怎么办?

–游艇
2014年2月4日15:04

@marines:检查是否在/ path下安装了另一个文件系统。这是隐藏的“打开文件”的原因之一。

– camh
2014年2月5日,9:16

lsof命令直接到路径不起作用。所以基本上需要进入路径位置,然后运行lsof busy_file,然后杀死所有进程

– J4cK
16年7月4日在11:56

lsof似乎对我无能为力:lsof storage / logs / laravel.log不返回任何内容,而lsof + D storage / logs /也是如此。 umount响应未安装。

–瑞安
18年5月25日在1:01

只是详细说明@camh答案:使用mount | grep <路径>。这表明任何/ dev / 都可以安装在上。使用sudo umount -lf / dev / ,然后尝试删除。为我工作。谢谢@camh

– Vikas Goel
18年6月27日在23:33

#2 楼

有时是挂载问题的结果,所以我将卸载要尝试删除的文件系统或目录:


umount / path


评论


四分之一到四分之一。谢谢你,我救了我一晚。搞笑单行-浪费了很多时间-.-'

– Aiyion.Prime
15年6月23日在1:48

我的问题是将日志目录挂载为/ dev / mapper / vg00-root

– Spikolynn
15年12月27日在21:56

帮助我摆脱绕线机的类似卡纸。

–乔恩
16年5月9日在17:44

就我而言,Jenkins在任务中止后没有卸载chroot目录

–扎尔肯
16年3月3日,下午3:46

我加入这个社区只是为了标记这个答案!

–克里斯·孔雀(Chris Peacock)
19年1月23日在22:50

#3 楼

我用fuser做这种事情。它将列出哪个进程正在使用一个文件或一个装载中的文件。

评论


当您要卸载文件系统时,fuser仅在特定情况下有用。这里的问题是查找正在使用特定文件的文件。

–吉尔斯'所以-不再是邪恶的'
2011年4月13日在19:09

@Gilles:也适用于文件。

–BillThor
2011年4月14日在0:36

抱歉,提出了错误的反对意见:热熔器在这里无济于事,因为问题在于在目录树中找到所有打开的文件。您可以告诉lsof显示所有文件和过滤器,或者使其递归; fuser没有这种模式,需要在每个文件上调用。

–吉尔斯'所以-不再是邪恶的'
2011年4月14日在7:57

@Giles:定影器工作将列出。试试fuser / var / log / *,如果打开了任何日志,它将告诉哪些日志以及谁打开了它。如果一个简单的通配符不起作用,则查找带有或不带有xargs的查找将起作用。

–BillThor
2011年4月14日在17:23

lsof不在我的路上,而热熔器在我的路上,这使我能够找到有问题的进程ID予以杀死,因此+1+表示感谢。

–stevesliva
2015年10月13日在19:48

#4 楼

解决方法如下:


进入目录并键入ls -a

您会找到一个.xyz文件

vi .xyz并查看文件的内容是什么?
ps -ef | grep username
您将在第八列(最后一行)中看到.xyz内容。

kill -9 job_ids-其中job_ids是第二列的值导致第8列中内容出现相应错误的原因
现在尝试删除文件夹或文件。


评论


知道那些神秘文件来自何处会很有趣。

–John WH Smith
14年8月12日在20:59

谢谢! -这是我可以在Cygwin中使用的唯一答案。荣誉

–丹尼·舒曼(Danny Schoemann)
20年8月5日在16:34

在我的情况下,这不起作用,根本没有.xyz文件。

–HorstKevin
20-10-15在10:57

#5 楼

我在具有NFS网络文件系统的服务器上经常遇到这种情况。我假设它与文件系统有关,因为文件通常命名为.nfs000000123089abcxyz

我典型的解决方案是重命名或移动文件的父目录,然后稍后在一两天后,该文件将被自动删除,此时,我可以自由删除目录。

这通常发生在我正在安装或编译软件库的目录中。

#6 楼

我遇到了同样的问题,以@camh建议开头构建了一个单行代码:
lsof +D ./ | awk '{print }' | tail -n +2 | xargs -r kill -9



awk捕获PID。

tail被摆脱讨厌的第一个条目:“ PID”。

xargs对PID执行kill -9。如果-r没有返回任何PID,则--no-run-if-empty / kill可以防止lsof命令失败。


评论


为了使其更通用,您可以将./用于当前目录,而不是log /

–user2589273
17年11月22日在17:26

好点,@ user2589273。更新。

– Choylton B. Higginbottom
17年11月22日在18:00

@ ChoyltonB.Higginbottom,您要求一种更安全的方法来防止kill 失败(如果lsof不返回任何内容)-将xargs与-r / --no-run-if-empty一起使用。对于非GNU xargs,请参见以下替代方法:stackoverflow.com/a/19038748

– Noam Manos
20 Jun 10'在7:29



#7 楼

绕过Prabhat的上述问题,当我搁置一个encfs进程并重新启动后,在macos high sierra中遇到了这个问题,但这

ps -ef | grep name-of-busy-dir


向我展示了该过程, PID(第二列)。

sudo kill -15 pid-here


修复了它。

评论


这也对我有用。什么是-15?

– O.rka
19年8月27日在23:55

@ O.rka 15是SIGTERM信号的ID,请参见此处:unix.stackexchange.com/questions/317492/list-of-kill-signals

–弗朗兹·威默(Franz Wimmer)
20/09/14 '16:14

#8 楼

当自动测试创建虚拟磁盘时,我遇到了这个问题。其他答案lsoffuser中建议的命令没有帮助。测试后,我尝试将其卸载,然后删除该文件夹。很久以来我一直感到困惑,因为我无法摆脱它-我一直都在“设备或资源繁忙”!
偶然地,我发现了如何摆脱虚拟磁盘。我必须卸载它的次数与运行mount命令的次数相同,即
sudo umount path
由于它是使用自动测试创建的,因此它已多次安装,因此为什么我不能在测试后只需将其卸载一次即可摆脱它。因此,在我多次手动卸载它之后,它终于又变成了常规文件夹,可以删除它。

#9 楼

如果您可以访问服务器,请尝试


从服务器中删除该目录


,或者重新安装并重新安装,请尝试umount -l:lazy如果遇到正常umount上的任何问题,则umount。

我也遇到了以下问题,其中

lsof +D path:不提供输出

ps -ef:不提供相关信息