Обнаружение битого потока в Python при удалении файла - PullRequest
4 голосов
/ 10 мая 2011

Моя проблема заключается в том, что запись журнала для программы на 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 ]

2 голосов
/ 11 мая 2011

После гораздо большего осмотра я нашел решение. Это специфическая проблема ОС. Когда файл удаляется в 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 = os.fstat(fs.fileno())

Что даст вам количество ссылок, которые у него есть.

if stat.st_nlink < 1:
    #has been deleted

И вот, пожалуйста. Теперь вы знаете, если вы должны перезагрузить его или нет. Надеюсь, это поможет кому-то еще.

0 голосов
/ 15 августа 2011

Другое решение, которое я нашел, - добавить флаг «copytruncate» в конфигурацию logrotate. Смотрите "man logrotate" для получения дополнительной информации.

0 голосов
/ 10 мая 2011

Существуют привязки Python для ionotify, если вам нужно больше интеллекта, чем просто предложение try: except:.Но я думаю, что это относится только к Linux (я не уверен в вашей платформе)

0 голосов
/ 10 мая 2011

Попробуйте Обработка исключений :

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
...