web-dev-qa-db-ja.com

umountが失敗しました:デバイスがビジーです

/tmpramfsとしてマウントされているフォルダがあります。スクリプトが実行するアクションの後、次のコマンドを使用して、上記のフォルダー内のすべてを削除します。

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か月間有効)

関連するumountは、cleanupプロシージャの行#346、つまりumount "$DEST_DIR"にあります。

4
Dor

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

2
Andrew