다음 링크를 참조했더니 해결되었습니다.
"장치 또는 리소스 사용 중"을 극복하는 방법은 무엇입니까?
위의 해결 방법은 파일을 수동으로 삭제할 때 작동합니다. 하지만 파일을 삭제하는 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 시스템의 예를 참조하세요.)