마운트 해제 실패: 장치 사용 중

마운트 해제 실패: 장치 사용 중

/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(10월 1일, 11:04 UTC):
모든 코드(단일 파일)를 다음 위치에 복사했습니다.http://pastebin.com/RJP6eQiy(1개월간 유효)

관련 내용은 절차의 #346행, 즉 에 umount있습니다 .cleanupumount "$DEST_DIR"

답변1

마운트 해제 전에 디스크에 먼저 (디스크 캐시를 플러시/쓰기 위해) '동기화'가 필요하다고 생각합니다. 'rm' 명령 뒤에 동기화를 추가한 다음(일부 OS에서는 두 개의 동기화 명령이 필요함) 마운트를 해제하세요. '바쁨' 메시지가 사라져야 합니다.

관련 정보