4

私の問題は、ログがローテーションされると、Python プログラムのログが停止することです。私はそれをストリーム自体まで追跡しました。ストリームが Python から壊れているかどうかを確認する方法がわかりません。ファイルが削除された後も、問題なく書き込みを受け入れます。

import os

FILE = 'testing.txt'

fs = open(FILE, 'a')
fs.write('word')
os.remove(FILE)
fs.write('Nothing....') # Nothing breaks
print(fs.errors) # No errors

では、ファイル ストリームがまだ有効かどうかを確認するにはどうすればよいでしょうか。また、ストリームがまだ有効であるかどうかに関係なく、ファイルは常に存在するため、ファイルが存在するかどうかを確認しても役に立ちません。

4

4 に答える 4

2

さらに詳しく調べたところ、解決策が見つかりました。OS固有の問題です。ファイルが Linux (または Macintosh) で削除されると、リンクが解除されるだけです。(私はこれに気づいていませんでした)したがって、マシンで lsof を実行すると、ファイルが開いていると表示されます。

[user@machine]$ lsof | grep --color -i "testing.txt"
python26  26495    user    8w      REG               8,33     23474     671920 /home/user/temp/testing.txt (deleted)

解決策は、python でストリームを stat することです。

stat = os.fstat(fs.fileno())

これにより、リンクの数がわかります。

if stat.st_nlink < 1:
    #has been deleted

そして、そこに行きます。これで、リロードする必要があるかどうかがわかります。うまくいけば、これは他の誰かに役立ちます。

于 2011-05-11T13:41:20.120 に答える
0

try: except:単なる節よりも多くのインテリジェンスが必要な場合は、ionotify の python バインディングがあります。しかし、Linuxにのみ関連すると思います(プラットフォームがわかりません)

于 2011-05-10T19:28:20.807 に答える
0

私が見つけた別の解決策は、「copytruncate」フラグを logrotate 構成に追加することです。詳細については、「man logrotate」を参照してください。

于 2011-08-15T14:01:47.160 に答える
0

例外処理を試してください:

import os

FILE = 'testing.txt'

try:
    fs = open(FILE, 'a')
    fs.write('word')
    os.remove(FILE)
    fs.write('Nothing....') # Nothing breaks
except Exception, e:
    print "Error:", e
print(fs.errors) # No errors
于 2011-05-10T19:18:48.153 に答える