← Назад к вопросам

Как посмотреть какие порты заняты в Bash

1.2 Junior🔥 151 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Как посмотреть занятые порты в Bash

Частая задача — узнать какой процесс занял нужный порт, особенно когда получаешь ошибку "Address already in use". Покажу несколько способов.

Способ 1: netstat (классический)

# Показать все активные соединения
netstat -tulpn

# Объяснение флагов:
# -t = TCP сокеты
# -u = UDP сокеты
# -l = только LISTEN сокеты
# -p = показать PID и имя процесса
# -n = показать IP и номер порта цифрами (не hostname и service name)

# Output:
# Proto Recv-Q Send-Q Local Address      Foreign Address     State       PID/Program name
# tcp        0      0 127.0.0.1:8080     0.0.0.0:*           LISTEN      12345/java
# tcp        0      0 0.0.0.0:3306       0.0.0.0:*           LISTEN      5678/mysqld

Фильтруем конкретный порт

# Какой процесс слушает на порту 8080?
netstat -tulpn | grep :8080
# Output: tcp  0  0 0.0.0.0:8080  0.0.0.0:*  LISTEN  12345/java

# Более точный поиск
netstat -tulpn | grep LISTEN | grep 8080

Способ 2: ss (новый, рекомендуется)

# Показать все LISTENING сокеты
ss -tulpn

# Или более читаемо
ss -tulpn | grep LISTEN

# Найти конкретный порт
ss -tulpn | grep :8080

# Output:
# LISTEN  0  128  127.0.0.1:8080  0.0.0.0:*  users:(("java",pid=12345,fd=45))

Удобный формат

# Показать все LISTEN сокеты с PID
ss -tlnp

# Со статусом и очередями
ss -tln --stat

Способ 3: lsof (мощный инструмент)

# Какие процессы слушают на порту 8080?
lsof -i :8080

# Output:
# COMMAND  PID  USER  FD   TYPE DEVICE SIZE/OFF NODE NAME
# java    12345 root   45u  IPv4 123456      0t0  TCP *:8080 (LISTEN)

# Показать все network соединения
lsof -i -P -n | grep LISTEN

# Флаги:
# -i = интернет сокеты
# -P = не переводить номера портов в имена
# -n = не переводить IP адреса в hostname

Примеры с lsof

# Показать всё что использует процесс с PID 12345
lsof -p 12345

# Показать какой процесс занял порт и получить его PID
lsof -i TCP:8080 -s TCP:LISTEN

# Убить процесс который занял порт 8080
kill $(lsof -t -i :8080)

# Более безопасно — с подтверждением
kill -9 $(lsof -t -i :8080)  # -9 = SIGKILL (немедленное)

Способ 4: fuser

# Какой процесс использует порт 8080?
fuser 8080/tcp
# Output: 8080/tcp:             12345

# Показать детали процесса
fuser -v 8080/tcp
# Output:
#                USER     PID ACCESS COMMAND
# 8080/tcp:        root   12345 F.... java

# F = файловый дескриптор открыт
# e = выполняется в текущей директории
# r = корневая директория

# Завершить процесс
fuser -k 8080/tcp  # посилает SIGTERM
fuser -k -9 8080/tcp  # посилает SIGKILL

Способ 5: nmap (если установлен)

# Сканировать локальную машину
nmap -p 8080 localhost

# Output:
# Starting Nmap 7.80
# Nmap scan report for localhost (127.0.0.1)
# Host is up (0.000032s latency).
# PORT     STATE  SERVICE
# 8080/tcp open   http-proxy

# Сканировать диапазон портов
nmap -p 8000-9000 localhost

Практические команды для разных сценариев

Проверить конкретный порт (универсальный способ)

# 1. Быстро узнать есть ли кто-то на порту 8080
ss -tlnp | grep :8080

# 2. Если это не работает, используй lsof
lsof -i :8080

# 3. Если даже lsof не установлен, используй netstat
netstat -tulpn | grep 8080

Посмотреть ВСЕ занятые порты

# Все TCP сокеты в режиме LISTEN
ss -tlnp

# Или
netstat -tulpn | grep LISTEN

# Или
lsof -i -P -n | grep LISTEN

Показать какой Java процесс слушает

# Все Java процессы и их порты
lsof -i -P -n | grep java

# Или
ps aux | grep java | grep -v grep  # показать все Java процессы

# Комбинированный способ
jps -l  # показать Java процессы
lsof -i -P -n | grep 12345  # где 12345 это PID из jps

Скрипт для удобного поиска

#!/bin/bash
# find-port.sh

if [ -z "$1" ]; then
    echo "Usage: $0 <port>"
    exit 1
fi

PORT=$1

echo "=== Looking for processes on port $PORT ==="

if command -v lsof &> /dev/null; then
    lsof -i :$PORT
elif command -v ss &> /dev/null; then
    ss -tlnp | grep :$PORT
elif command -v netstat &> /dev/null; then
    netstat -tulpn | grep :$PORT
else
    echo "No suitable command found (lsof, ss, or netstat required)"
    exit 1
fi

Использование

chmod +x find-port.sh
./find-port.sh 8080

Причины ошибки "Address already in use"

# Сценарий 1: Процесс ещё в CLOSE_WAIT
# Решение: дождаться или перезагрузить
sleep 2 && ./myapp &

# Сценарий 2: Несколько приложений на одном порту
# Решение: убить старый процесс
kill $(lsof -t -i :8080)
./myapp &

# Сценарий 3: Запуск с другого IP
java -jar app.jar --server.address=127.0.0.1 --server.port=8081

Мониторинг портов в реальном времени

# Следить за изменениями портов каждую секунду
watch -n 1 'ss -tlnp'

# Или с grep для конкретного приложения
watch -n 1 'lsof -i -P -n | grep java'

# Прекратить: Ctrl+C

Рекомендации по выбору команды

КомандаПлюсыМинусыКогда использовать
ssНовая, быстрая, вездеМожет быть незнакома старым разработчикамLinux системы (новые)
lsofМощная, точная, вездеМожет быть медленной на большом числе соединенийКогда нужны детали про процесс
netstatКлассическая, вездеНемного устаревшаяCompatibility, старые системы
fuserПростая для убийства процессаМенее информативнаяКогда нужно быстро убить процесс
nmapДля сканирования сетиНужно установить отдельноСканирование диапазонов портов

Best Practices

  1. Предпочитай ss вместо netstat — современнее и быстрее
  2. Используй lsof для деталей — если нужно понять что происходит
  3. Проверяй оба IPv4 и IPv6 — порты могут быть заняты на одном из них
  4. Логируй оккупированные порты — в скриптах запуска приложений
  5. Используй SO_REUSEADDR — в приложении для быстрого перезапуска

На практике

Вот один скрипт который я использую в разработке:

#!/bin/bash
# check-port.sh — полная диагностика

PORT=${1:-8080}
echo "Checking port $PORT..."

if ss -tlnp 2>/dev/null | grep -q ":$PORT "; then
    echo "✓ Port $PORT is in LISTEN state"
    ss -tlnp | grep ":$PORT"
elif lsof -i :$PORT 2>/dev/null; then
    echo "✓ Found process using port $PORT:"
    lsof -i :$PORT
else
    echo "✗ No process found on port $PORT"
    exit 1
fi

Для быстрой проверки используй ss -tlnp | grep :8080, для деталей lsof -i :8080.

Как посмотреть какие порты заняты в Bash | PrepBro