Найти (и убить) процесс блокировки порта 3000 на Mac

Как мне найти процессы, которые слушают / используют мои порты TCP? Я на Mac OS X

Иногда, после сбоя или некоторой ошибки, мое приложение rails блокирует порт 3000. Я не могу найти его, используя ps -ef... Как мне найти глупость и убить ее, жестоко...?

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

rails server

я получил

Адрес уже используется - bind (2) (Errno:: EADDRINUSE)

2014 обновление:

Чтобы завершить некоторые из ответов ниже: После выполнения команд kill может потребоваться удаление файла pid. rm ~/mypath/myrailsapp/tmp/pids/server.pid

47 ответов

Решение
  1. Ты можешь попробовать netstat

    netstat -vanp tcp | grep 3000
    
  2. Для macOS El Capitan и новее (или если ваш netstat не поддерживает -p), используйте lsof

    sudo lsof -i tcp:3000 
    
  3. Для Centos 7 использовать

    netstat -vanp --tcp | grep 3000
    

Найти:

[sudo] lsof -i :3000

Убийство:

kill -9 <PID>

Самое простое решение: убить несколько портов с помощью одной строки.

kill $(lsof -t -i:3000,3001) // 3000 and 3001 are the ports to be freed

lsof -t -i: 3000

82500

lsof -t -i: 3001

82499

lsof -t -i: 3001,3000

82499 82500

убить $(lsof -t -i:3001,3000)

Завершает процессы 82499 и 82500 в одной команде.

lsof -t -i: 3000

lsof -t -i: 3001

Вы можете использовать это в package.json скрипты

"scripts": { "start": "kill $(lsof -t -i:3000,3001) && npm start" }

Ничто из вышеперечисленного не помогло мне. Любой другой с моим опытом может попробовать следующее (работал для меня):

Бежать:

lsof -i :3000 (where 3000 is your current port in use)

затем проверьте статус сообщенного PID:

ps ax | grep <PID>

наконец-то "смирись с этим":

kill -QUIT <PID>

Эту единственную командную строку легко запомнить:

npx kill-port 3000

Для более мощного инструмента с поиском:

npx fkill-cli


PS: они используют сторонние пакеты javascript

Источники: твит | GitHub

Однострочное извлечение PID процесса с использованием порта 3000 и его уничтожение.

lsof -ti:3000 | xargs kill

Флаг -t удаляет все, кроме PID, из вывода lsof, что упрощает его уничтожение.

Ты можешь использовать lsof -i:3000,

Это "Список открытых файлов". Это дает вам список процессов и какие файлы и порты они используют.

Чтобы принудительно убить такой процесс, используйте следующую команду

lsof -n -i4TCP:3000 

Где 3000 - номер порта, на котором запущен процесс

это возвращает идентификатор процесса (PID) и запуска

kill -9 "PID"

Замените PID на число, которое вы получите после выполнения первой команды

Например, если я хочу убить процесс, запущенный на порту 8080

В вашем .bash_profileсоздать ярлык для terminate 3000 процесс:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Затем позвоните $terminate если он заблокирован

Чтобы убить мульти порты.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Надеюсь на эту помощь!

lsof -P | grep ':3000' | awk '{print $2}'

Это даст вам только pid, протестированный на MacOS.

Выполните в командной строке на OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

Краткий вариант lsof возвращает только PID.

Одним из способов уничтожения процесса в порту является использование библиотеки python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9). После установки просто:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

Чтобы просмотреть процессы, блокирующие порт:

netstat -vanp tcp | grep 3000

Чтобы убить процессы, блокирующие порт:

kill $(lsof -t -i :3000)

Найди и убей:

Эта единственная командная строка проста и работает правильно.

kill -9 $(lsof -ti tcp:3000)

Найти открытое соединение

lsof -i -P | grep -i "слушай"

Убить по идентификатору процесса

убить -9 'PID'

Возможные способы достижения этого:

Топ

Команда top - это традиционный способ просмотреть использование ресурсов вашей системы и увидеть процессы, которые занимают большинство системных ресурсов. Вверху отображается список процессов, причем те, которые используют наибольшее количество процессоров, находятся вверху.

п.с.

Команда ps выводит список запущенных процессов. Следующая команда выводит список всех процессов, запущенных в вашей системе:

ps -A

Вы также можете передать вывод через grep для поиска определенного процесса без использования каких-либо других команд. Следующая команда будет искать процесс Firefox:

ps -A | grep firefox

Наиболее распространенный способ передачи сигналов в программу - команда kill.

kill PID_of_target_process

Lsof

Список всех открытых файлов и процессов, которые их открыли.

lsof -i -P | grep -i "listen"
kill -9 PID

или же

 lsof -i tcp:3000 

lsof -i tcp:port_number - перечислит процесс, запущенный на этом порту

kill -9 PID - убьет процесс

в вашем случае это будет

lsof -i tcp:3000 из вашего терминала найдите PID процесса

kill -9 PID

Эти две команды помогут найти и убить серверный процесс.

  1. lsof -wni tcp:3000
  2. kill -9 pid

Я сделал небольшую функцию для этого, добавьте его в свой файл RC (.bashrc, .zshrc или что угодно)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

тогда вы можете просто напечатать kill-by-port 3000 убить ваш сервер rails (подставив 3000 для любого порта, на котором он работает)

в противном случае вы всегда можете просто набрать kill -9 $(cat tmp/pids/server.pid) из корневого каталога рельсов

      kill -9 $(lsof -ti:3000)

у меня работает на macOS всегда.

Если вы работаете над проектом node.js, вы можете добавить его в сценарии package.json, например:

      "scripts": {
    ...
    "killme": "kill -9 $(lsof -ti:3000)",
    ...
  },

тогда

      npm run killme

Конечно, вы можете изменить порт 3000 на то, что хотите.

Добавить в ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

затем source ~/.bash_profile и беги

killTcpListen 8080

Используя инструмент fkill от sindresorhus, вы можете сделать это:

$ fkill :3000

У меня работает для оконечного узла (Mac OS Catalina)

killall -9 node

TL;DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Если вы находитесь в ситуации, когда порт используют как клиенты, так и серверы, например:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

тогда вы, вероятно, не хотите убивать обоих.

В этой ситуации вы можете использовать -sTCP:LISTEN показывать только пид процессов, которые слушают. Сочетая это с -t В кратком формате вы можете автоматически убить процесс:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Чтобы убить порт 3000 на Mac, выполните следующую команду

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)

Вот вспомогательная функция bash для уничтожения нескольких процессов по имени или порту

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

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

$ fkill [process name] [process port]

Пример:

$ fkill someapp :8080 node :3333 :9000

Вы можете попробовать это

netstat -vanp tcp | grep 3000

просто напишите в терминале

      sudo kill -9 $(lsof -i :3000 -t)

надеюсь, это работа.

Вы должны попробовать это, этот метод не зависит от ОС.

В стороне вашего приложения есть папка с именем tmp, внутри которой есть еще одна папка с именем pids. Этот файл содержит файл pid сервера. Просто удалите этот файл. Порт автоматически убивает себя.

Я думаю, что это простой способ.

Другие вопросы по тегам