← Назад к вопросам
Как посмотреть какие порты заняты в 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
- Предпочитай ss вместо netstat — современнее и быстрее
- Используй lsof для деталей — если нужно понять что происходит
- Проверяй оба IPv4 и IPv6 — порты могут быть заняты на одном из них
- Логируй оккупированные порты — в скриптах запуска приложений
- Используй 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.