По мотивам собеса. Значит ситуация, человек запускает постгрю в докере, но контейнер не стартует потому что порт 5432 уже занят. Дальше начинается отладка, которая с большой вероятностью будет не очень успешной, если разработчик не знаком с тем как функционируют операционки. И так, поехали в разбор.
Почему порт занят, что это значит? Значит что на этом порту уже запущена какая-то программа. Почти наверняка это постгрес, который был установлен прямо в систему.
Первым делом стоит проверить, а не запущен ли уже контейнер с базой, возможно для другого проекта: `docker ps`. Если в выводе есть: `0.0.0.0:5432->5432/tcp`, то отладка прошла, можно стопать и запускать нужный конейтенер. А если нет?
Едем дальше, проверяем что в принципе висит на этом порту. Сделать это можно кучей способов из которых я предпочитаю `lsof`:
```bash
lsof -i :5432
NAME
localhost:postgresql->localhost:60378 (FIN_WAIT_2)
localhost:60378->localhost:postgresql (CLOSE_WAIT)
```
Для простоты я оставил здесь только NAME, но сам вывод показывает и команду и пид и пользователя. В общем достаточно информативно.
И да, постгрес действительно запущен напрямую из системы. Осталось только его остановить. И тут начинается веселуха. Не все в курсе о том как работает запуск программ в операционках и начинают килять их налево и направо. Например так:
```bash
sudo kill -9 <pid>
```
Выполнив эту команду, человек радостно пытается запустить постгрес в контейнере и внезапно видит ту же ошибку о занятом порте. Что за херня думает он и пробует еще разок, а потом еще и еще.
Вот тут остановитесь и подумайте. А что собственно говоря происходит?
А происходит здесь автоматический старт супервизором. Это специальная системная программа, которая запускается сразу после загрузки операционки и управляет жизненным циклом сервисов. В том числе через нее задаются разные настройки, например, нужно ли рестартовать если какая-то служба (тот же постгрес), грохнулась. Правила это довольно гибкие, там и количество рестартов и причины рестарта и зависимости (кого за кем стартовать) и даже ограничения по ресурсам.
Именно супервизор делает так, что вам не нужно просыпаться в поту ночью если ваш веб-сервер грохнулся в продакшене. Если для возобновления работы достаточно его просто запустить, то это сделает супервизор.
Локально все работает точно так же, даже если вы этого явно не видите. Постгрес стартует в вашей системе не сам по себе, его запускает супервизор и управлять им нужно через супервизор. В Ubuntu это systemd, в MacOS launchd. В каждой из этих систем предоставляется высокоуровневый интерфейс для работы. Вот как это выглядит для тех кто использует brew:
```bash
brew install postgresql@14
brew services start postgresql@14
brew services list
Name Status User File
postgresql@14 started kirill ~/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist
php none
caddy none
brew services stop postgresql@14
```
Плюс минус тоже самое во всех остальных операционках.
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев