НейроАгент

Как найти и завершить процессы на порту 3000 в macOS

Пошаговое руководство по идентификации и завершению процессов, использующих порт 3000 в macOS. Включает команды lsof, методы завершения процессов и советы по предотвращению для разработчиков.

Вопрос

Как найти и завершить процессы, слушающие порт 3000 в macOS

Как вручную найти и завершить процессы с помощью терминала, которые слушают или используют мои TCP-порты? Я работаю на macOS.

Иногда после сбоя или ошибки мой Rails-приложение “застревает” на порту 3000, и я не могу найти его с помощью ps -ef

При выполнении:

rails server

Я получаю:

Address already in use - bind(2) (Errno::EADDRINUSE)

Та же проблема возникает при остановке процесса Node.js. Даже после остановки процесса и завершения работы приложения порт 3000 остается заблокированным. При повторном запуске приложения я получаю:

Address already in use (Errno::EADDRINUSE)
НейроАгент

Как найти и завершить процессы, использующие порт 3000 в macOS

Для поиска и завершения процессов, использующих порт 3000 в macOS, вам потребуется использовать команды терминала для идентификации идентификатора процесса (PID) и затем его завершения. Наиболее эффективный подход заключается в использовании команды lsof для перечисления процессов, использующих порт, а затем команды kill для завершения конкретного процесса.

Содержание

Поиск процессов на порту 3000

Команда lsof (list open files) — это наиболее надежный способ найти процессы, использующие определенный порт в macOS. Вот основные команды:

Использование lsof для поиска процесса

bash
sudo lsof -i :3000

Эта команда покажет все процессы, прослушивающие порт 3000. В выводе будет включено:

  • Идентификатор процесса (PID)
  • Имя процесса
  • Пользователь, владеющий процессом
  • Информация об устройстве и сети

Пример вывода:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rails    12345  user   20u  IPv4 0x12345678      0t0  TCP localhost:3000 (LISTEN)
node     12346  user   21u  IPv4 0x12345679      0t0  TCP localhost:3000 (LISTEN)

Альтернативные команды lsof

Если вам нужна более подробная информация:

bash
sudo lsof -ti :3000  # Показывает только PID
sudo lsof -i -P -n | grep 3000  # Показывает порт с IP-адресами

Использование netstat (устаревший метод)

Для старых версий macOS или альтернативных подходов:

bash
sudo netstat -an | grep 3000
sudo netstat -anvp tcp | grep 3000

Завершение процесса

После того как вы идентифицировали идентификатор процесса, вы можете завершить его несколькими способами:

Корректное завершение (рекомендуется)

Начните с корректного завершения:

bash
sudo kill -TERM <PID>

Принудительное завершение

Если процесс не завершается корректно:

bash
sudo kill -KILL <PID>

Прямое использование lsof

Вы можете объединить шаги поиска и завершения:

bash
sudo kill -9 $(sudo lsof -ti :3000)

Эта команда находит все PID на порту 3000 и принудительно завершает их.

Несколько процессов

Если несколько процессов используют порт:

bash
sudo kill -9 $(sudo lsof -ti :3000 | tr '\n' ' ')

Альтернативные методы

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

Если lsof недоступен или вы предпочитаете использовать ps:

bash
sudo ps aux | grep -i port
sudo ps aux | grep -i 3000

Использование Монитора активности (GUI)

Для тех, кто предпочитает графический интерфейс:

  1. Откройте Монитор активности (Приложения > Утилиты > Монитор активности)
  2. Перейдите на вкладку “Сеть”
  3. Отсортируйте по столбцу “Порт”
  4. Найдите процессы, использующие порт 3000
  5. Выберите их и нажмите “Завершить процесс”

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

Если вы знаете имя процесса (например, Rails или Node.js):

bash
sudo killall rails
sudo killall node

Предотвращение будущих проблем

Лучшие практики для серверов разработки

  1. Всегда завершайте серверы корректно:

    bash
    # Rails
    Ctrl+C
    # или
    pkill -f "rails server"
    
    # Node.js
    Ctrl+C
    # или
    pkill -f "node server.js"
    
  2. Используйте менеджеры процессов:

    • Для Rails: используйте puma-dev или foreman
    • Для Node.js: используйте nodemon с --signal SIGTERM
  3. Настройте правильную обработку портов:

    bash
    # Rails - добавьте в config/environments/development.rb
    config.server = :puma, { debug: true, workers: 0 }
    
    # Node.js - обработка SIGTERM
    process.on('SIGTERM', () => {
      server.close(() => {
        console.log('Процесс завершен');
        process.exit(0);
      });
    });
    

Автоматическое восстановление порта

Создайте псевдоним в вашем профиле оболочки:

bash
alias killport="sudo kill -9 \$(sudo lsof -ti :3000)"

Затем просто выполните:

bash
killport

Расширенное устранение неполадок

Проверка зомби-процессов

Иногда процессы кажутся мертвыми, но все еще занимают порты:

bash
sudo ps aux | grep -E '(Z|defunct)'
sudo kill -9 <zombie_pid>

Проверка статуса порта

Убедитесь, что порт действительно свободен:

bash
nc -zv localhost 3000
# или
telnet localhost 3000

Системный мониторинг портов

Мониторинг всех активных портов:

bash
sudo lsof -i -P | grep -i "listen"

Проблемы с контейнерами Docker

Если вы используете Docker, проверьте потерянные контейнеры:

bash
docker ps -a
docker rm <container_id>

Состояние TIME_WAIT

Иногда порты остаются в состоянии TIME_WAIT:

bash
sudo sysctl -w net.inet.tcp.msl=1000

Заключение

  • Всегда начинайте с sudo lsof -i :3000 для идентификации процессов, использующих порт 3000 в macOS
  • Сначала используйте kill -TERM для корректного завершения, затем kill -KILL при необходимости
  • Объединяйте команды с помощью sudo kill -9 $(sudo lsof -ti :3000) для быстрого решения
  • Предотвращайте проблемы с помощью правильных менеджеров процессов и процедур корректного завершения работы
  • Создавайте псевдонимы вроде killport для частых операций очистки портов
  • Рассмотрите альтернативы с GUI вроде Монитора активности, если вы предпочитаете визуальные инструменты

Для разработчиков Rails и Node.js реализация правильной обработки сигналов в ваших приложениях предотвратит большинство проблем с привязкой портов и обеспечит корректное завершение работы.

Источники

  1. Документация по терминалу Apple macOS
  2. Страница руководства lsof - OpenBSD
  3. Руководство по команде kill - GNU Coreutils
  4. Руководство по администрированию системы macOS