web-dev-qa-db-ja.com

NFSマウント:デバイスまたはリソースがビジーです

私は次のリンクを参照しました、解決策は機能します。

「デバイスまたはリソースビジー」を回避する方法?

上記の解決策は、ファイルを手動で削除するときに機能します。しかし、pythonファイルを削除するスクリプト(自動プロセス)があります。スクリプトがファイルを削除しようとすると、「デバイスまたはリソースビジーエラー」が表示されることがあります。その結果、スクリプトが失敗します。私のpythonスクリプトを使用してこの問題を解決する方法がわかりません。

EDIT:スクリプトはログサーバーからログファイルをダウンロードします。次に、これらのファイルは私のスクリプトによって処理されます。処理が完了すると、スクリプトはこれらのログファイルを削除します。デザインに問題はないと思います。

正確なエラー:

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

これらのファイルは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サーバー上のファイルには、1つ以上のクライアントがアクセスしている場合があります。 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などの特定の構成要素を使用してこれを処理し、ログファイルがまだ使用されている間はログファイルが圧縮されないようにします。 (例として、少なくともDebianシステムの/etc/logrotate.d/Apache2を参照してください。)

8
roaima