Домой Edit me on GitHub

2019-06-19

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

Что делать когда возникает ошибка «Address already in use»

Не закрытые соединения занимают порт, даже после завершения программы. Обычно операционная система закрывает их сама по таймауту. Рассмотрим варианты как это сделать вручную.

Netstat

netstat показывает сетевую активность системы. Из списка всех сетевых сервисов мы можем отфильтровать интересующий нас:

$ sudo netstat -tulpn | grep :8080
tcp   0    0 127.0.0.1:8080     0.0.0.0:*     LISTEN      11778/python

Номер процесса, который занимает порт, 11778. Уничтожим его принудительно:

$ sudo kill -9 11778

Дополнительную информацию о процессе можно получить из директории /proc:

$ ls /proc/11778/

fuser

Утилита fuser ищет номер процесса по порту:

$ fuser 8080/tcp
8080/tcp:            11778

Флаг -k уничтожит процесс:

$ fuser -k 8080/tcp
8080/tcp:            11778

lsof

lsof - показывает все процессы связанные с файловыми дескрипторами. Флаг -i позволяет фильтровать сетевые сокеты:

$ lsof -i :8080
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python  11778 uralbash    7u  IPv4 5754939      0t0  TCP localhost:http-alt (LISTEN)
Previous: Работа с HTTP через сокеты