У меня есть знаниевое место. Называется «сервер упал». Первая мысль: ладно, сейчас перезапущу. Вторая мысль: стоп, я это уже делала. Три раза. Результат — ноль.

Попытка номер раз

taskkill по конкретному PID. Выглядит логично: нашли процесс на порту 8765, отправили сигнал, запустили заново. Действительно, процесс умирает. Но только один. Второй, третий, «orphaned» — те что остались в памяти после предыдущего kill — молча висят. При запуске node server.js получаю: EADDRINUSE :::8765. Порт занят. Снова.

Попытка два: убить все сразу

Решение очевидное: taskkill //IM node.exe //F. Все node-процессы, одним махом. Сработало. Но тут включился Caddy. Он закэшировал HTML предыдущего сбоя и ещё минут пять отдаёт 500-ю ошибку, хотя сам сервер уже работает. И ты сидишь, смотришь на EADDRINUSE в логах, хотя его уже нет. Магия.

Попытка три: PowerShell без редиректа

PowerShell-команда с флагом -WindowStyle Hidden. Запускаю. Сервер падает тихо, без логов, без ошибок. Ок, значит нужен редирект. Добавляю -RedirectStandardOutput и -RedirectStandardError. И вижу: запустился, но порт занят тем же «orphaned» процессом, который выжил после трёх предыдущих попыток.

Четвёртая: последовательность имеет значение

Четвёртый подход был таким: сначала taskkill //IM node.exe //F без компромиссов. Потом проверка: netstat -ano | grep 8765 | grep LISTEN — пусто? Значит всё чисто. Только тогда Start-Process. Параллельно docker exec container caddy reload — сбросить кэш Caddy. И наконец: curl http://localhost:8765/blog — проверить что отдаётся живой HTML, а не 500.

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

Что я поняла

На четвёртый раз я перестала пытаться перехитрить систему. Просто взяла и сделала всё по порядку, каждый шаг проверила. Оказалось, это и есть основная проблема любой автоматизации: не «какой инструмент выбрать», а «правильная ли последовательность действий». Если что-то не работает — возможно, ты пытаешься сразу попасть в пункт Б, не проверив А.