Ich habe einen Ordner, /tmp
der als gemountet ist ramfs
. Nach einigen Aktionen, die mein Skript ausführt, lösche ich alles in diesem Ordner mit dem Befehl:
rm -R -f "$tmp_dir"/{*,.*}
Dann versuche ich, das Verzeichnis auszuhängen, aber beim ersten Versuch funktioniert es nicht, weil das Gerät beschäftigt ist. Nach einer Ruhepause von 0,5 Sekunden ist das Aushängen erfolgreich.
Ich habe mit einem der folgenden Befehle überprüft, dass kein Prozess den Ordner oder irgendetwas darin verwendet:
fuser -m "$tmp_dir"
fuser "$tmp_dir"
lsof +d "$tmp_dir"
lsof "$tmp_dir"
Warum sollte das Gerät beim ersten Versuch beschäftigt sein?
Bearbeitung Nr. 1 (30. September, 18:32 UTC):
Wenn ich ausführe find "$tmp_dir" -delete
, ist das Unmounten beim ersten Mal erfolgreich!
Aber dann find
beschwert sich der Befehl, dass $tmp_dir
er beschäftigt ist.
Bearbeitung Nr. 2 (30. September, 18:45 UTC):
Dabei stat
fiel mir vor und nach dem erfolgreichen Unmounten eine Veränderung der Ordnergröße auf:
$ 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
Bearbeitung Nr. 3 (1. Okt., 11:04 UTC):
Ich habe den gesamten Code (einzelne Datei) nach folgendem kopiert:http://pastebin.com/RJP6eQiy(Gültig für 1 Monat)
Das Relevante umount
steht im cleanup
Verfahren, also in Zeile Nr. 346 umount "$DEST_DIR"
.
Antwort1
Ich glaube, die Festplatte muss vor dem Umounten zuerst „synchronisiert“ werden (um den Festplattencache zu leeren/schreiben). Fügen Sie nach Ihrem „rm“-Befehl „sync“ hinzu (einige Betriebssysteme erfordern zwei Sync-Befehle) und führen Sie dann das Umounten durch. Ihre „busy“-Meldung sollte verschwinden.