Остановка сервера разработки и всего, что он запустил
Остановка всегда сначала делает следующее: Moonpool завершает терминал, который он запустил для приложения, вместе со всем, что этот терминал запустил. Для многих приложений этого достаточно.
Некоторые приложения переживают этот терминал (окно обычного приложения отсоединяется от сервера разработки,
который его запустил, или подпроцесс сервера продолжает удерживать порт). killMode выбирает один
дополнительный шаг, который выполняется после этого.
killMode |
Дополнительный шаг при остановке | Использует | По умолчанию для |
|---|---|---|---|
processName |
Принудительно завершает каждый процесс с этим именем. В Windows вместе с его дочерними процессами (taskkill /IM <name>.exe /T /F). В остальных системах pkill -KILL -x <name>: точное совпадение имени с учётом регистра, дочерние процессы не затрагиваются. |
processName |
desktop |
port |
Принудительно завершает процесс, который слушает port. |
port |
web |
command |
Выполняет stopCommand в cwd и ждёт её завершения. |
stopCommand, cwd, env |
ничего |
none |
Ничего. | ничего | static, cli |
Не указывайте killMode, чтобы получить значение по умолчанию для типа приложения, и задавайте его, только если после остановки
что-то продолжает работать.

- Список
killMode. «по умолчанию (по типу)» равносильно отсутствию ключа.
- Если поле, нужное режиму, пусто (например, режим
portбезport), дополнительный шаг пропускается. Это не ошибка. killModeне зависит отtype:portработает для приложенияcli,processNameдля приложенияweb.- Пустая строка или нераспознанное значение не делают ничего дополнительного. Возврата к значению по умолчанию для типа не происходит.
Для обычного приложения режим processName выполняет эквивалент:
taskkill /IM notes-app.exe /T /FНесколько копий Moonpool или ваши собственные процессы
Заголовок раздела «Несколько копий Moonpool или ваши собственные процессы»processName и port не знают, кто запустил процесс. processName завершает каждый
процесс с этим именем, а port завершает всё, что слушает порт, включая процесс,
запущенный другой копией Moonpool (установленная и портативные копии работают независимо; см.
Портативный режим), и процесс, который вы запустили сами.
Используйте эти режимы только для приложений, которые не будут так конфликтовать: имя или порт, которые больше
никто на компьютере не использует. Если две копии регистрируют одно и то же приложение или вы ещё и запускаете его вручную, задайте ему
killMode none или command, который останавливает только собственный экземпляр.
stopCommand
Заголовок раздела «stopCommand»Используется только когда killMode равен command. Выполняется через cmd /c в Windows и $SHELL -c
в остальных системах, в cwd, с добавленным env. В ней работают {MP_HOME} и {MP_DATA}. Moonpool
ждёт её завершения, прежде чем делать что-либо ещё, поэтому перезапуск никогда не запускает приложение снова, пока она
ещё выполняется. Её код возврата игнорируется. Если она всё ещё выполняется через 60 секунд,
Moonpool завершает её и её дочерние процессы и продолжает работу.
Перезапуск
Заголовок раздела «Перезапуск»Перезапуск - это остановка с последующим запуском того же command. Moonpool ждёт до 4 секунд, пока
старый экземпляр будет считаться остановленным (чтобы его порт освободился), и только потом запускает снова. Запись static
только с url останавливать нечего: перезапуск просто снова открывает страницу.
Приложения Docker в Windows
Заголовок раздела «Приложения Docker в Windows»Используйте none или command с настоящей командой остановки, например docker compose stop app. Не
используйте port.
Docker Desktop публикует порт каждого контейнера через один общий фоновый процесс. В
Windows «то, что слушает порт» - это именно этот общий процесс, поэтому режим port
принудительно завершил бы Docker Desktop и остановил все контейнеры, а не только это приложение. В качестве страховки
Moonpool отказывается завершать по порту фиксированный список общих процессов Windows: внутренние процессы,
прокси и службы Docker Desktop, dockerd, vpnkit, процессы узла WSL и основные
системные процессы, такие как svchost. Это не заменяет выбор правильного режима.
Если ваш command уже пересоздаёт контейнер (docker compose up -d --build), правильный вариант - none:
перезапуск просто выполняет его снова.
См. также Поиск и завершение процесса, занимающего порт и Исправление EADDRINUSE и «Port 5173 is in use».
Примеры
Заголовок раздела «Примеры»Сервер разработки, который иногда оставляет процесс node, удерживающий порт (это значение по умолчанию для
web, здесь показанное явно):
{ "id": "site", "name": "Site", "group": "Web apps", "type": "web", "cwd": "C:\\code\\site", "command": "npm run dev", "port": 5173, "killMode": "port" }Приложение Docker Compose:
{ "id": "api", "name": "API", "group": "Web apps", "type": "web", "cwd": "C:\\code\\api", "command": "docker compose up -d --build", "port": 8080, "killMode": "command", "stopCommand": "docker compose stop app" }Moonpool: бесплатное программное обеспечение от FasterDB