Во все дыры
Было это несколько лет назад на старой теперь уже работе. Стояла куча региональных серверов с одной структурой, но разными данными, и порой возникали задачи вроде «выполнить этот запрос на 20 серверах, проанализировать данные и отослать результат по почте на эти адреса». Каждая такая задача была реализована простым VBS-скриптом. Человек, который занимался этим, к моему приходу уже уволился, поэтому курс обучения начался и кончился тем, что мне выдали всё ранее им написанное и новую задачу на реализацию. Сложности были, но небольшие, кроме одного случая, который заставил меня хоть и ненадолго, но поверить в то, что у компьютера есть свобода воли.
Небольшой скриптик: обработка одной базы с достаточно обширным логированием в простой текстовик, который не пересоздавался, а с каждым запуском просто дополнялся новыми строками. Работа шла в понятном режиме: исправление кода, запуск, пара секунд ожидания, проверка файла с результатом, исправление кода... Где-то через полчаса я начал замечать неладное: новые логи в файле шли в разрез с тем, что было в скрипте. И если сначала это были мелкие детали, на которые я не обратил внимания, то постепенно, изменяя в коде текст логов, я почувствовал, что схожу с ума: скрипт выполнялся, файл с логами увеличивался, вот только новые записи содержали тот текст, который в коде вообще отсутствовал.
Не помню уже, сколько времени я пытался вникнуть в проблему, когда отвлёкся от непрерывного исправления и запуска новых версий и обнаружил, что размер файла с логами по-прежнему увеличивается. После этого я догадался открыть диспетчер задач. В списке процессов мирно висело десять-пятнадцать одинаковых записей «wscript.exe», после уничтожения которых файл наконец перестал расти в размерах.
Причина оказалась простой: данных в базе было много, логирование шло долго, никакой информации о завершении выполнения скрипта не выводилось, а о том, что результат запроса может анализироваться продолжительное время, я тогда не задумывался. Позже, наученный опытом, я стал везде ставить вывод всплывающего сообщения о завершении работы; тогда же процессы поочерёдно хватали файл, нагружали его своими данными и отпускали, а в случае отсутствия доступа обработка просто шла дальше. Когда я всё понял и представил в лицах, как толпа одинаковых скриптов разного возраста дёргает наперегонки в разные стороны один несчастный файлик, со всех сторон запихивая в него свои логи, было смешно. Но до этого я был в полной уверенности, что восстание машин уже не за горами.