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

1813

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

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

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

rails server

я получил

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

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

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

OMA
источник
25
Очень аккуратное решение для уничтожения процесса на ЛЮБОМ указанном пользователем порту можно найти в ответе @Kevin Suttle ниже. Воспроизводится здесь для потомков:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584
4
Порт 3000 не «сильно зависит от разработки рельсов» - Meteor изначально работает и на 3000, и я уверен, что есть и другие.
gregorvand
Приведенный выше комментарий @ user456584 должен быть принятым ответом ^^^ Эта функция работала, чтобы убить многие процессы, которые я выполнял на порте
Aneuway

Ответы:

3030
  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
    
ghostdog74
источник
22
Спасибо! Ваш ответ породил мой сценарий "death_to 'port'". (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1
192
Флаг "кратко" для lsof производит вывод, подходящий для передачи по трубам для последующего уничтожения:lsof -t -i tcp:1234 | xargs kill
Manav
7
Я вложил это в свое ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillтак что теперь мне просто нужно набрать killport 8080текст, и это экономит мне несколько секунд
Альфонсо Перес
3
Еще один совет: не забудьте попробовать sudoперед lsof, если вы не видите никаких результатов
Abe Petrillo
4
Еще один совет , чтобы добавить -Pк lsofкоманде , так что исходный порт виден на выходе:lsof -P -i:3000
Джейсон Акселсон
1879

Найти:

sudo lsof -i :3000

Убийство:

kill -9 <PID>
Филипп Спиридонов
источник
61
Иногда lsof -i: port ничего не показывает. попробуй sudo lsof -i: порт .
kilik52
31
Рекомендуем попробовать, kill -15 <PID>прежде чем прибегнуть к -9безопасности.
Хамон Холмгрен
7
@ Джеймон Холмгрен, почему? что делают оба? и почему kill <PID>недостаточно / опасно / неполноценно?
Майкл Троу,
13
@MichaelTrouw почти год спустя, но вот твой ответ. :-) unix.stackexchange.com/a/8918 TL; DR kill -15дает возможность очистить процесс после себя.
Хамон Холмгрен
9
Я думаю, что этот ответ должен сказать, что -9делает.
Джозеф Фрейли
207

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

Запустить:

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

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

ps ax | grep <PID>

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

kill -QUIT <PID>
Остин
источник
18
На самом деле это кажется лучшим ответом, чем тот, который дал гораздо позже Филип Спиридонов, у которого 277 голосов против ваших 9. Ваш был 6 месяцев назад, и содержит ту же информацию с чуть большим количеством объяснений. Нет справедливости ...
Флорис
Попробуйте kill -TERM(или просто kill) раньше kill -QUIT. Не каждый процесс собирается сделать корректное завершение работы SIGQUIT.
craig65535
160

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

lsof -ti:3000 | xargs kill

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

Zlemini
источник
13
Вы можете отфильтровать «прослушивающие» порты с помощью:lsof -ti:3000 -sTCP:LISTEN
Zlemini
1
Этот метод работает лучше всего для меня. Простой один лайнер, который очищает занятый порт. Спасибо!
Райан Трейнор
139

Самое простое решение :

Для одного порта:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Убить несколько портов с помощью одной строки:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (идентификатор процесса / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

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

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

Для использования этого в package.jsonскриптах:

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

Абхиджит Сасикумар
источник
2
Это сработало для меня Спасибо :)
DILEEP THOMAS
2
Рад, что это помогло.
Абхиджит Сасикумар
113

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

npx kill-port 3000

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

npx fkill-cli


PS: они используют сторонние пакеты javascript. npxпоставляется с Node.js.

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

Бруно Лемос
источник
Можете поделиться подробностями по установке npx с помощью brew? Я попытался установить его на моем Mac High Sierra, 10.13.3, и он не будет работать.
realPK
@realPK npxпоставляется вместе npmс node.jsкомплектом, так что это не отдельный пакет. Просто обновите ваш node.js и ваши версии npm.
Бруно Лемос
Я в основном занимаюсь Java, пока не выставляю себя на Node. Я нашел другой способ убить службу, работающую в порту. TY для ответа.
realPK
5
Потребность в NodeJS и JavaScript для уничтожения чего-либо, работающего на порте 3000, вероятно, рельсы ... мне кажется, это слишком много. добавление простой строки к вашему .bashrc или .zshrc с псевдонимом решило бы это без необходимости в интернете. псевдоним kill3000 = 'lsof -ti: 3000 | xargs kill 'тогда вы можете сделать: kill3000
Khalil Gharbaoui
Лучшее решение этой проблемы .. спасибо
король Райхан
107

Вы можете использовать lsof -i:3000.

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

DerMike
источник
Я на 10,5 Lepard (обновленный Q). Я не знаю, имеет ли это здесь значение, но lsof не отображает порты. lsof -h (lsof 4.78) слишком загадочен и я ...
oma
1
Хм. Не знаю наверняка о Leopard, но попробуй ( как root - я думаю, это важно) lsof -i:3000.
Мэтт Гибсон
59

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

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

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

alexzg
источник
12
Вы можете сделать это достаточно гибким для любого порта: github.com/kevinSuttle/dotfiles/commit/…
Кевин Саттл
И такое описательное имя = p
Майкл Петерсон
У меня что-то похожее на это, но я прохожу в порту. Я назвал свою функцию KP для уничтожения порта.
Джозеф Чемберс
58

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

lsof -n -i4TCP:3000 

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

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

kill -9 "PID"

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

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

Таделе Айлень
источник
38
lsof -P | grep ':3000' | awk '{print $2}'

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

Kris
источник
10
на MAC убить все pids на порту 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | xargs kill -9
Майк Клэгг
1
Может ли несколько процессов прослушивать один и тот же порт?
Крис
Наше приложение rails порождает рабочих, которые являются дочерними процессами, и я должен использовать это, чтобы убить осиротевших рабочих
Майк Клэгг
2
это также убивает
веб-браузеров,
5
Вот работает один:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
Боб
29

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

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

Краткая опция lsof возвращает только PID.

JE42
источник
28

Одним из способов уничтожения процесса в порту является использование библиотеки 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
YBathia
источник
7
Это, безусловно, НЕ самый простой способ. Ответы, за которые проголосовали, не требуют от вас загрузки и установки чего-либо.
Грег Pasquariello
4
Когда предварительные условия выполнены, это так просто и легко запомнить. У нас есть другое определение «самый простой», и этот ответ является совершенно обоснованным и уместным. Может быть, просто не хватает инструкции по установке freeport с помощью pip.
Кирилл Дюшон-Дорис
под капотом freeport - просто обертка, которая звонит lsof -t -i:3000.. кажется ненужной.
Кори Голдберг
Это решение не самое простое, но оно на 100% соответствует тому, что просил ОП ... Так что на самом деле оно действительно AF
danielrvt
26

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

netstat -vanp tcp | grep 3000

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

kill $(lsof -t -i :3000)

Генри
источник
Это не будет работать на компьютере Mac, возвращает следующее: Однако kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]оно будет работать в большинстве дистрибутивов Linux
Milan Velebit
1
@MilanVelebit На самом деле он отлично работает на моем компьютере Mac (Sierra). Работает нормально, если ваш порт 3000занят. Однако, если ни один процесс не блокирует порт, вы получите kill: not enough argumentsошибку.
Генри
Это просто странно, у меня есть два Mac (оба High Sierra tho), я помню, как запускал эти команды на обеих из них (старые привычки), и я точно знаю, что они не работают. Я только что попробовал это снова на моей машине, зная, что порт занят, та же ошибка. : /
Милан Велебит
Получили ли вы действующий PID netstat -vanp tcp | grep 3000для своего занятого порта?
Генри
1
Я пробовал это в обоих bashи zshоболочке. У меня отлично работает. Не уверен, почему это не работает для вас. Может быть, что-то с Высшей Сьеррой? Я понятия не имею: /
Генри
24

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

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

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

убить -9 'PID'

Сурабх Бхагат
источник
20

Найди и убей:

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

kill -9 $(lsof -ti tcp:3000)
Дилан Брёйн
источник
14

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

Вверх

Команда 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 
гладкий; плавный
источник
10

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

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

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

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

kill -9 PID

Shan
источник
10

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

  1. lsof -wn tcp: 3000
  2. убить -9 пид
Саиф Чаудхри
источник
С удовольствием, Аашия
Саиф Чаудхри
5

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

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

Тогда source ~/.bash_profileи беги

killTcpListen 8080

rofrol
источник
4

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только показ pid процессов, которые слушают. Комбинируя это с -tкратким форматом, вы можете автоматически убить процесс:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
Бенджи
источник
4

Я сделал небольшую функцию для этого добавьте его в файл гс ( .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)из корневого каталога rails

Калеб Кин
источник
Мне пришлось поставить обратную косую черту, \$PORTчтобы сообщение отображалось правильно. В остальном прекрасно работает!
ясень
4

Чтобы убить несколько портов.

$ npx kill-port 3000 8080 8081

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

Надеюсь, это поможет!

Бинь Хо
источник
1

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

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

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

Арун П
источник
1

Вот вспомогательная функция 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
Мигель Мота
источник
1

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

netstat -vanp tcp | grep 3000
Форам Такрал
источник
0

Если вы хотите свободный от кода код - откройте диспетчер активности и принудительно уничтожьте узел :)

HannahCarney
источник
0

Я использую это:

cat tmp/pids/server.pid | pbcopy

затем kill -9 'paste'

Михаил Хидр0 Кирилов
источник
-1

Шаг 1: Найти сервер, который работает: ps aux | grep puma Шаг 2: Убить этот сервер Kill -9 [номер сервера]

Thiện Nguyễn
источник
-1

В Mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')

ноль
источник
1
Это было опубликовано в качестве комментария 5 лет назад, и ответы на вопросы были опубликованы несколько раз.
Жиль Гуаиллардет