NFS 마운트: 장치 또는 리소스가 사용 중입니다.

NFS 마운트: 장치 또는 리소스가 사용 중입니다.

다음 링크를 참조했더니 해결되었습니다.

"장치 또는 리소스 사용 중"을 극복하는 방법은 무엇입니까?

위의 해결 방법은 파일을 수동으로 삭제할 때 작동합니다. 하지만 파일을 삭제하는 Python 스크립트(자동 프로세스)가 있습니다. 때때로 스크립트가 파일을 삭제하려고 할 때 "장치 또는 리소스 사용 중 오류"가 발생합니다. 따라서 내 스크립트가 실패합니다. 내 Python 스크립트를 사용하여 이 문제를 해결하는 방법을 모르겠습니다.

편집하다: 이 스크립트는 로그 서버에서 로그 파일을 다운로드합니다. 그런 다음 이 파일은 내 스크립트에 의해 처리됩니다. 처리가 완료되면 스크립트는 이러한 로그 파일을 삭제합니다. 디자인에는 문제가 없다고 생각합니다.

정확한 오류:

OSError: [Errno 16] Device or resource busy: '/home/johndoe/qwerty/.nfs000000000471494300000944'

답변1

다음 파일은 NFS 자리 표시자입니다.

/home/johndoe/qwerty/.nfs000000000471494300000944

일부 배경

일반적인 UNIX 파일 시스템에서는 현재 사용 중이고 열려 있는 파일을 삭제할 수 있지만 해당 파일의 내용은 마지막 파일 핸들이 닫힐 때까지 실제로 사라지지 않습니다. 다음과 같은 코드를 사용하여 실제 동작을 확인할 수 있습니다.

$ ps -ef >/tmp/temporaryfile
$ ls -l /tmp/temporaryfile
-rw-r--r-- 1 roaima roaima 6758 Mar  2 14:02 /tmp/temporaryfile

$ ( sleep 60 ; cat ) </tmp/temporaryfile &
[1] 4864

$ rm /tmp/temporaryfile
$ ls -l /tmp/temporaryfile
ls: cannot access /tmp/temporaryfile: No such file or directory

$ fg    # Wait for the rest of the minute
( sleep 60; cat ) < /tmp/temporaryfile
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:44 ?        00:00:02 init [2]
root         2     0  0 09:44 ?        00:00:00 [kthreadd]
root         3     2  0 09:44 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 09:44 ?        00:00:00 [kworker/0:0H]
...
roaima    4857  4786  0 14:02 pts/1    00:00:00 -bash
roaima    4858  4857  0 14:02 pts/1    00:00:00 ps -ef

(이는 파일이 열려 있는 동안에는 파일을 삭제할 수 없는 Microsoft Windows와 대조됩니다.)

설명하다

NFS 서버의 파일에는 해당 파일에 액세스하는 클라이언트가 하나 이상 있을 수 있습니다. NFS 자체는 (대부분) 상태 비저장이므로 삭제된 후에도 열린 파일에 액세스할 수 있도록 허용하는 기능을 에뮬레이트해야 합니다.

시뮬레이션은 파일 시스템의 해당 위치에서 파일을 제거하고 이름이 .nfs. 마지막 판독기/작성기가 파일에 대한 파일 핸들을 닫으면 해당 파일은 파일 시스템에서 적절하게 제거됩니다.

실제적인 예는 다음과 같습니다.

$ ps -ef > /var/autofs/net/nfsserver/tmp/temporaryfile
$ ls -l /var/autofs/net/nfsserver/tmp/temporaryfile
-rw-r--r-- 1 roaima roaima 6766 Mar  2 14:14 /var/autofs/net/nfsserver/tmp/temporaryfile

$ ( sleep 60 ; cat ) </var/autofs/net/nfsserver/tmp/temporaryfile &
[1] 4987

$ rm /var/autofs/net/nfsserver/tmp/temporaryfile
$ ls -l /var/autofs/net/nfsserver/tmp/temporaryfile
ls: cannot access /var/autofs/net/nfsserver/tmp/temporaryfile: No such file or directory

$ ls -lA /var/autofs/net/nfsserver/tmp/
total 8
-rw-r--r-- 1 roaima roaima 6766 Mar  2 14:14 .nfs000000000100000300000001

$ rm /var/autofs/net/nfsserver/tmp/.nfs000000000100000300000001
rm: cannot remove ‘/var/autofs/net/nfsserver/tmp/.nfs000000000100000300000001’: Device or resource busy

$ fg    # Wait for the rest of the minute
( sleep 60; cat ) < /var/autofs/net/nfsserver/tmp/temporaryfile
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:44 ?        00:00:02 init [2]
root         2     0  0 09:44 ?        00:00:00 [kthreadd]
root         3     2  0 09:44 ?        00:00:01 [ksoftirqd/0]
...
roaima    4983  4712  0 14:14 pts/0    00:00:00 ps -ef

추론

에 이름이 있는 NFS 마운트를 무시해야 합니다 .nfs. 또한 코드는 해당 파일이 실제로 모두 사라지기 전에 원격 디렉터리를 삭제할 수 없는 가능성에 대처해야 합니다.

NFS는 원하는 만큼 애플리케이션에 투명하지 않습니다.

논평

로그 파일이 여전히 열려 있는 이유는 원격 시스템의 로거 프로세스에서 해당 파일을 계속 사용하고 있기 때문일 수 있습니다. 일반적으로 해결 방법은 로그 파일을 순환하여 이전 로그 파일만 다운로드 및 삭제하고, 현재 로그 파일은 로거 프로세스에서 사용할 수 있도록 파일 시스템에 남겨 두는 것입니다.

이와 같은 유틸리티는 특정 구성 요소를 사용하여 로그 파일이 사용 중인 동안 압축되지 않도록 하는 logrotate등 이를 처리합니다 . delaycompress( /etc/logrotate.d/apache2적어도 Debian 시스템의 예를 참조하세요.)

관련 정보