卸载失败:设备忙

卸载失败:设备忙

我其中有一个文件夹/tmp安装为ramfs.在我的脚本执行一些操作后,我使用以下命令删除所述文件夹内的所有内容:

rm -R -f "$tmp_dir"/{*,.*}

然后,我尝试卸载该目录,但第一次尝试时它不起作用,因为设备正忙。休眠0.5秒后,卸载成功。

我已通过以下命令验证没有进程正在使用该文件夹或该文件夹内的任何内容:

fuser -m "$tmp_dir"
fuser "$tmp_dir"
lsof +d "$tmp_dir"
lsof "$tmp_dir"

为什么设备在第一次尝试时会很忙?


编辑#1(9 月 30 日,18:32 UTC):
当我执行时find "$tmp_dir" -delete,第一次卸载成功!
但随后find指挥部抱怨说$tmp_dir很忙。


编辑#2(9 月 30 日,18:45 UTC):
stat注意到在卸载成功之前和之后文件夹的大小发生了变化:

$ stat '/tmp/tmp.nbljlVcmix'
  File: `/tmp/tmp.nbljlVcmix'
  Size: 0           Blocks: 0          IO Block: 4096   directory
Device: 17h/23d Inode: 121188      Links: 2
Access: (0700/drwx------)  Uid: ( 1000/     dor)   Gid: (    0/    root)
Access: 2013-09-30 20:37:51.430769893 +0300
Modify: 2013-09-30 20:37:51.430769893 +0300
Change: 2013-09-30 20:37:51.430769893 +0300
$ umount '/tmp/tmp.nbljlVcmix'
umount: /tmp/tmp.nbljlVcmix: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
$ sleep 0.5
$ umount '/tmp/tmp.nbljlVcmix'
$ stat '/tmp/tmp.nbljlVcmix'
  File: `/tmp/tmp.nbljlVcmix'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 806h/2054d  Inode: 2401825     Links: 2
Access: (0700/drwx------)  Uid: ( 1000/     dor)   Gid: (    0/    root)
Access: 2013-09-30 20:37:47.600513531 +0300
Modify: 2013-09-30 20:37:47.600513531 +0300
Change: 2013-09-30 20:37:47.610513892 +0300

编辑 #3(UTC 时间 10 月 1 日 11:04):
我已将所有代码(单个文件)复制到:http://pastebin.com/RJP6eQiy(有效期1个月)

相关的umountcleanup程序中的第 #346 行,即umount "$DEST_DIR".

答案1

我相信在卸载之前磁盘首先需要“同步”(以刷新/写入磁盘缓存)。在“rm”命令后添加同步(某些操作系统需要两个同步命令),然后卸载。您的“忙碌”消息应该会消失。

相关内容