アンマウント失敗: デバイスがビジー状態です

アンマウント失敗: デバイスがビジー状態です

/tmpに としてマウントされているフォルダーがありますramfs。スクリプトが何らかのアクションを実行した後、次のコマンドを使用して、そのフォルダー内のすべてのものを削除します。

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

次に、ディレクトリをアンマウントしようとしましたが、デバイスがビジー状態のため、最初の試行では機能しません。0.5 秒間スリープした後、アンマウントは成功します。

次のコマンドのいずれかを使用して、フォルダーまたはそのフォルダー内のものを使用しているプロセスがないことを確認しました。

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

1 回目の試行でデバイスがビジー状態になるのはなぜですか?


編集#1 (9月30日、18:32 UTC):
を実行するとfind "$tmp_dir" -delete、アンマウントは 1 回目で成功します。
しかし、その後、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 (10月1日 11:04 UTC):
すべてのコード (単一ファイル) を次の場所にコピーしました:http://pastebin.com/RJP6eQiy(有効期間1ヶ月)

関連するのは、手順umountcleanup行番号 346、つまり ですumount "$DEST_DIR"

答え1

ディスクをアンマウントする前に、まず「同期」(ディスク キャッシュをフラッシュ/書き込み)する必要があると思います。「rm」コマンドの後に同期を追加し(一部の OS では 2 つの同期コマンドが必要です)、その後にアンマウントします。「ビジー」メッセージは消えるはずです。

関連情報