Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНовичкам

Ошибки, которые стоили мне недели

Денис Прошин
Денис Прошин
Знаток
сообщений 1000
с июн
1 января, 08:12первое сообщение

Раз в разделе для новичков принято делиться граблями, выложу свои. Все четыре стоили мне минимум по рабочей неделе, и все четыре выглядели в момент совершения совершенно безобидно.

Первая. Глушил исключения. У меня в сборщике стоял except на всё подряд с пустым телом, потому что скрипт постоянно падал и это раздражало. Падать он перестал, а собирать перестал тоже, только молча. Три недели база пополнялась мусором, и заметил я это по тому, что цифры в отчёте перестали шевелиться.

Вторая. Правил рабочий скрипт прямо на сервере через редактор в терминале. Однажды нажал не туда, сохранил, и рабочая версия исчезла. Копии не было нигде, потому что я же аккуратный.

Третья. Складывал результат сразу поверх старого файла. Прогон падал на середине, и я оставался без нового результата и без старого одновременно.

Четвёртая. Ставил задачу в расписание и не проверял, от чьего имени она пойдёт. Из под своей учётки всё работало, из под службы переменные окружения были другие, и скрипт неделю запускался вхолостую.

cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
8 июня, 11:29#2

Четвёртая у меня была дважды. Второй раз с часовым поясом службы, что ещё веселее.

Костя Фомин
Костя Фомин
Знаток
сообщений 1600
с апр
15 ноября, 14:46#3

По третьей есть простой приём, его стоит вбить в привычку с самого начала. Пишете во временный файл рядом, а в конце переименовываете поверх целевого. Переименование в пределах одной файловой системы происходит целиком, обрыва на середине там не бывает.

import os, tempfile
katalog = "/srv/sbor/out"
fd, vrem = tempfile.mkstemp(dir=katalog)
with os.fdopen(fd, "w", encoding="utf-8") as f:
    f.write(gotovyy_json)
os.replace(vrem, os.path.join(katalog, "rezultat.json"))

Пока прогон не дошёл до последней строки, старый файл лежит целым. Упали на середине, значит просто удалили временный и пошли разбираться.

Ирина Пахомова
Ирина Пахомова
Новичок
сообщений 280
с янв, второй сезон
22 апреля, 17:03#4

а по первой как правильно? я тоже глушу, иначе прогон встаёт на первой же битой странице

Денис Прошин
Денис Прошин
Знаток
сообщений 1000
с июн
1 сентября, 08:20#5

Глушить можно, только громко. Ловите узкое исключение, пишите в лог адрес и текст ошибки, ведите счётчик, и если доля отказов перевалила за порог, останавливайте прогон сами.

Ирина Пахомова: иначе прогон встаёт на первой же битой странице

Он и должен вставать, если битых страниц половина. Молчаливый скрипт хуже падающего: падающий вы почините за час, молчаливый вы обнаружите через месяц.

tabless
tabless
Участник
сообщений 800
с июл
8 февраля, 11:37#6

Добавлю пятую в копилку, у меня она отняла дней десять. Я хранил список обработанных адресов в памяти процесса. Прогон длинный, машина ушла в перезагрузку по обновлению, и после старта скрипт пошёл по второму кругу с самого начала. Дубли потом вычищал руками.

Отметка о том, что адрес обработан, должна ложиться на диск сразу, хоть строкой в текстовый файл. Тогда после любого обрыва вы продолжаете с места остановки.