![删除目录挂起](https://linux22.com/image/19591/%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95%E6%8C%82%E8%B5%B7.png)
我是共享编译服务器上的非 root 用户,该服务器/home
通过 NFS 从其他主机挂载。我有一个~/a/b
包含很多子目录的目录c1,c2,...
。我想~/a/b
彻底删除,大部分cN
目录都成功了。但有一些(比如c1
)是完全无法访问的:我可以执行它们(即cd
进入它们),但列表(ls
)都不能,更不用说删除它们了。如果我说rm -rf ~/a/b/c1
,则进程将处于挂起D
状态。
作为非 root 用户我可以做什么来摆脱~/a/b
?
更新:我只是 ssh 到文件服务器(以排除 NFS),而且我也无法在那里执行操作,所以这似乎根本不是 NFS 问题。但是,为什么内核拒绝删除目录呢?
答案1
删除文件或目录是一项原子操作,需要一个系统调用,因此如果该rm
命令挂起,那是因为内核被卡住了。在 NFS 文件系统上,这可能(通常是)由于服务器没有响应而导致。在本地文件系统上,这可能(通常是)由于硬件故障造成的。您的磁盘可能出现故障;内核日志会证实这一点。
答案2
如果它在查找和删除操作期间挂起,您可以为该过程设置超时,如下所示(这里我bash
在 Windows 上使用 cygwin 调用它):
bash -c "find . -regex ".+fileDirToDelete" -exec rm -Rf {} \; & pid=$!; sleep 100; kill $pid"
答案3
检查是否有任何进程正在访问后台的文件(例如它们当前的工作目录)。我会使用诸如lsof
和 之类的工具fuser -v
,看看是否有任何进程弄乱了目录,并首先将其删除。如果需要,请重新启动 nfs 客户端服务,并尝试检查该目录是否存在,并且当该目录是同一 shell 的当前工作目录时,请勿删除该目录。