Ответ
Для инспекции занятых портов в Linux используются утилиты ss (рекомендуемая, современная) и netstat (устаревшая, но широко известная).
1. Использование ss (socket statistics):
Утилита ss из пакета iproute2 быстрее и показывает более детальную информацию, чем netstat.
# Показать все слушающие (LISTEN) TCP и UDP порты с именами процессов
sudo ss -tulnp
Ключи команды ss:
-t— отображать TCP сокеты.-u— отображать UDP сокеты.-l— показывать только сокеты в состоянии LISTEN (ожидающие подключений).-n— не резолвить имена (показывать IP и номера портов).-p— показывать PID и имя процесса, владеющего сокетом.-4/-6— фильтровать по IPv4 или IPv6.
Пример полезных комбинаций:
# Какие процессы слушают на конкретном порту (например, 80)
ss -tlnp sport = :80
# Показать все установленные TCP-соединения
ss -tnp state established
# Показать все UDP-сокеты
ss -unp
2. Использование netstat (устаревшее):
Может отсутствовать в минимальных образах. Синтаксис похож.
sudo netstat -tulnp
3. Использование lsof (list open files):
Очень мощная утилита для поиска процессов по порту.
# Какие процессы используют порт 443?
sudo lsof -i :443
# Показать все процессы, слушающие сетевые порты
sudo lsof -i -P -n | grep LISTEN
4. Проверка конкретного порта с nc или telnet:
Чтобы проверить, доступен ли порт локально (не только слушает, но и отвечает).
nc -zv localhost 22
telnet localhost 22
Практический пример из DevOps: При развертывании нового сервиса, который должен слушать порт 8080, я сначала проверяю, не занят ли он:
if sudo ss -tlnp | grep -q ':8080 '; then
echo "Порт 8080 уже занят:"
sudo ss -tlnp | grep ':8080 '
exit 1
else
echo "Порт 8080 свободен, можно запускать."
fi
Эта проверка часто встраивается в скрипты деплоя или в health-check'и контейнеров.
Ответ 18+ 🔞
Слушай, ну вот реально, какого хуя каждый раз гуглить, какой порт чем занят? Будто в первый раз. Ладно, щас разжуёшь, запоминай раз и навсегда, а то потом опять будешь как мартышлюшка по клавиатуре тыкать.
В общем, есть у нас две основные команды, но одна из них — старый дед, который уже еле дышит. Современная и быстрая — это ss (socket statistics). Она из пакета iproute2, работает моментально, информации показывает овердохуища. Вторая — netstat. Ну, её все знают, но она уже как тот полупидор на лавочке — вроде есть, но лучше бы его не было. Медленная, пожирает ресурсы, в новых минимальных образах её может и не быть.
Вот смотри, как ss юзать, чтобы всё про твои порты узнать:
# Эта команда — твой лучший друг. Покажет ВСЁ, что слушает TCP и UDP, и какой процесс этим владеет.
sudo ss -tulnp
Ключи тут простые, но без них нихуя не получится:
-t— это для TCP.-u— это, ясень пень, для UDP.-l— покажи только то, что в состоянии LISTEN, то есть ждёт подключений. А то тебе же не нужны все установленные соединения, верно?-n— не преобразовывать адреса и порты в имена. Покажет цифры, это быстрее и точнее.-p— вот это самое важное! Покажет PID и имя процесса, который этот сокет держит. Безsudoтут иногда нихуя не увидишь, имей в виду.
Ну и комбинации для конкретных случаев, а то ты же любишь усложнять:
# Допустим, тебя ебёт, кто на порту 80 сидит. Вот тебе ответ.
ss -tlnp sport = :80
# Хочешь посмотреть все активные TCP-соединения? Пожалуйста.
ss -tnp state established
# Всё, что по UDP летает.
ss -unp
А теперь про netstat. Ну, если уж очень хочется, команда почти такая же, но чувствуется, что ей уже пизда рулю. Просто запомни, что ss лучше.
sudo netstat -tulnp
Есть ещё одна хитрая жопа — lsof. Утилита мощнейшая, может по порту процесс найти. Например, если какой-то пидарас шерстяной занял порт 443, а кто — непонятно:
sudo lsof -i :443
Ну и классика жанра — проверить, а отвечает ли порт вообще. Не просто слушает, а чтобы к нему можно было подключиться. Берёшь nc (netcat) или старого доброго telnet:
nc -zv localhost 22
telnet localhost 22
А вот реальная история из жизни, чтобы ты понял, нахуя это всё:
Представь, разворачиваешь ты новый сервис в контейнере, и он должен стартануть на порту 8080. А он не стартует, потому что порт уже занят. Чтоб не гадать, вставляешь в скрипт деплоя такую проверку:
if sudo ss -tlnp | grep -q ':8080 '; then
echo "Порт 8080 уже занят, ёпта:"
sudo ss -tlnp | grep ':8080 '
exit 1
else
echo "Порт 8080 свободен, можно запускать."
fi
Вот и всё. Запомнил? А то будешь как тот Фарлаф, только на объёбке проехать, а работать не сможешь.