卸載失敗:設備忙

卸載失敗:設備忙

我其中有一個資料夾/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”命令後添加同步(某些作業系統需要兩個同步命令),然後卸載。您的「忙碌」訊息應該會消失。

相關內容