Перейти к содержимому

Остановка сервера разработки и всего, что он запустил

Остановка всегда сначала делает следующее: 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 в диалоге «Изменить приложение» со значением «по умолчанию (по типу)» и строкой подсказки, где перечислено, что делает каждый тип по умолчанию

  1. Список 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, который останавливает только собственный экземпляр.

Используется только когда killMode равен command. Выполняется через cmd /c в Windows и $SHELL -c в остальных системах, в cwd, с добавленным env. В ней работают {MP_HOME} и {MP_DATA}. Moonpool ждёт её завершения, прежде чем делать что-либо ещё, поэтому перезапуск никогда не запускает приложение снова, пока она ещё выполняется. Её код возврата игнорируется. Если она всё ещё выполняется через 60 секунд, Moonpool завершает её и её дочерние процессы и продолжает работу.

Перезапуск - это остановка с последующим запуском того же command. Moonpool ждёт до 4 секунд, пока старый экземпляр будет считаться остановленным (чтобы его порт освободился), и только потом запускает снова. Запись static только с url останавливать нечего: перезапуск просто снова открывает страницу.

Используйте 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, здесь показанное явно):

apps.json
{ "id": "site", "name": "Site", "group": "Web apps", "type": "web",
"cwd": "C:\\code\\site", "command": "npm run dev", "port": 5173,
"killMode": "port" }

Приложение Docker Compose:

apps.json
{ "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