Найти (и убить) процесс блокировки порта 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

 Aneuway19 июн. 2019 г., 17:12
Комментарий @ user456584 выше должен быть принятым ответом ^^^ Эта функция работала, чтобы убитьмного процессы у меня были запущены в порту
 gregorvand07 дек. 2015 г., 14:44
Порт 3000 не «сильно зависит от разработки рельсов» - Meteor изначально работает и на 3000, и я уверен, что есть и другие.
 user45658417 янв. 2014 г., 19:39
Очень точное решение для уничтожения процесса на ЛЮБОМ указанном пользователем порту можно найти в ответе @Kevin Suttle ниже. Воспроизводится здесь для потомков:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }

Ответы на вопрос(27)

Решение Вопроса

Ты можешь попробоватьnetstat

netstat -vanp tcp | grep 3000

ЗаmacOS El Capitan и новее (или если ваш netstat не поддерживает-p), используйтеlsof

sudo lsof -i tcp:3000 

ЗаCentos 7 использование

netstat -vanp --tcp | grep 3000
 fuelusumar10 янв. 2019 г., 15:23
sudo lsof -i tcp:3000 работает как шарм на MacOS Mojave
 oma04 окт. 2010 г., 14:52
netstat -anp выходит из строя.netstat: option requires an argument -- p
 nomad20 июн. 2019 г., 13:27
netstat -tulpn | grep 3000 Затем убить идентификатор процесса kill -9 id
 Manav07 янв. 2014 г., 05:58
Флаг "terse" для lsof производит вывод, подходящий для передачи по трубам для последующего уничтожения:lsof -t -i tcp:1234 | xargs kill
 Abe Petrillo22 июл. 2016 г., 00:02
Еще один совет: обязательно попробуйтеsudo до lsof, если вы не видите никакого вывода
 oma04 окт. 2010 г., 15:03
netstat -anp tcp | grep 3000 шоуtcp4 1062 0 127.0.0.1.3000 127.0.0.1.51255 ESTABLISHED что дальше? 1062 не пид ...
 awidgery15 июл. 2015 г., 15:48
Если вы хотите только искать / убитьпрослушивание процессы, использованиеlsof -n -i4TCP:8001 -sTCP:LISTEN -t | xargs kill, Я обнаружил, что если бы я сделал это безLISTEN это часто убивало бы мой браузер, а также заблокированный процесс сервера разработки, поскольку браузер также использовал порт разработки.
 Seyed Jalal Hosseini14 февр. 2017 г., 19:21
на Maclsof  находится на/usr/sbin каталог, которого нет вPATH по умолчанию.
 oma04 окт. 2010 г., 16:16
о да! вы обновили правильно.lsof -i tcp:3000 отлично :)
 Alfonso Pérez11 нояб. 2015 г., 14:51
Я положил это в мой~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill Так что теперь я просто должен напечататьkillport 8080 и это экономит мне несколько секунд
 goodmanship04 апр. 2018 г., 23:33
netstat -vanp tcp | grep 3000 отлично работает на Высокой Сьерре
 Jason Axelson22 июл. 2016 г., 04:06
Еще один совет, чтобы добавить-P кlsof команда, так что необработанный порт виден в выводе:lsof -P -i:3000
 Dave Ceddia15 апр. 2015 г., 20:25
Если вы хотите знать, каков процесс, прежде чем убить его,ps xp <PID>, Всегда приятно выяснить причину конфликтов портов.
 Sv102 окт. 2013 г., 20:40
Спасибо! Ваш ответ породил мой сценарий "death_to 'port'". (#! / USR / бен / рубинlsof -t -i tcp:#{ARGV.first} | xargs kill)
 chrismarx27 февр. 2017 г., 17:01
Судо ФТВ! На macos sierra я не получил вывод для lsof без sudo
 Will Munn20 апр. 2017 г., 17:53
@oma, если вы запустите команду netstat без grep, вы получите имена столбцов.

netstat -vanp tcp | grep 3000

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

kill $(lsof -t -i :3000)

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

добавьте его в свой файл 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) из корневого каталога рельсов

 ashwood17 мар. 2019 г., 21:24
Я должен был иметь обратную косую черту\$PORT чтобы сообщение отображалось правильно. В остальном прекрасно работает!

откройте менеджер активности и принудительно уничтожьте узел :)

по имени или порту

fkill() {
  for i in [email protected];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 [email protected] sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

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

$ fkill [process name] [process port]

Пример:

$ fkill someapp :8080 node :3333 :9000

может попробовать следующее (работал для меня):

Бежать:

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

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

ps ax | grep <PID>

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

kill -QUIT <PID>
 Floris30 дек. 2015 г., 23:15
Это на самом деле кажется лучшим ответом, чем тот, который дал гораздо позже Филип Спиридонов, у которого 277 голосов против ваших 9. Ваш был 6 месяцев назад, и содержит ту же информацию с чуть большим объяснением. Там нет справедливости ...

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

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

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

 Michael Peterson06 мар. 2017 г., 14:19
И такое описательное имя = р
 Kevin Suttle30 дек. 2013 г., 03:53
Вы можете сделать это достаточно гибким для любого порта:github.com/kevinSuttle/dotfiles/commit/...
 Joseph Chambers26 июл. 2018 г., 10:22
У меня что-то похожее на это, но я прохожу в порту. Я назвал свою функцию KP для уничтожения порта.

Топ

Команда 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 -n -i4TCP:3000 

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

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

kill -9 "PID"

Замените 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
 Greg Pasquariello25 мая 2016 г., 21:20
Это, безусловно, НЕ самый простой способ. Ответы, за которые проголосовали, не требуют от вас загрузки и установки чего-либо.
 Corey Goldberg16 нояб. 2018 г., 18:01
под капотом freeport - просто обертка, которая вызываетlsof -t -i:3000.. кажется ненужным
 danielrvt21 нояб. 2018 г., 16:11
Это решение не самое простое, но оно на 100% соответствует тому, что просил ОП ... Так что на самом деле оно действительно AF
 Cyril Duchon-Doris19 июл. 2017 г., 17:18
Когда предварительные условия выполнены, это так просто и легко запомнить. У нас есть другое определение «самый простой», и этот ответ является совершенно обоснованным и уместным. Может быть, просто не хватает инструкции по установке freeport с помощью pip.

ps aux | grep puma Шаг 2: Убить тех сервер Kill -9 [номер сервера]

npx kill-port 3000

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

npx fkill-cli

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

Источники:чирикать | GitHub

 realPK12 окт. 2018 г., 00:44
Можете поделиться подробностями по установке npx с помощью brew? Я попытался установить его на моем Mac High Sierra, 10.13.3, и он не будет работать.
 King Rayhan25 апр. 2019 г., 11:17
Лучшее решение этой проблемы .. спасибо
 Bruno Lemos12 окт. 2018 г., 10:40
@realPKnpx приходит сnpm который идет сnode.jsтак что это не отдельный пакет. Просто обновите ваш node.js и ваши версии npm.
 Khalil Gharbaoui09 янв. 2019 г., 12:19
Потребность в NodeJS и JavaScript для уничтожения чего-либо, работающего на порте 3000, вероятно, рельсы ... мне кажется, это слишком много. добавление простой строки к вашему .bashrc или .zshrc с псевдонимом решило бы это без необходимости в интернете. псевдоним kill3000 = 'lsof -ti: 3000 | xargs kill 'тогда вы можете сделать: kill3000
 realPK14 окт. 2018 г., 00:58
Я в основном занимаюсь Java, пока не выставляю себя Node. Я нашел другой способ убить службу, работающую в порту. TY для ответа.

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
lsof -P | grep ':3000' | awk '{print $2}'

 Kris15 мая 2013 г., 18:16
может ли более одного процесса прослушивать один и тот же порт?
 mike clagg13 мая 2013 г., 23:18
на MAC убить все pids на порту 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | XARGS убить -9
 mike clagg15 мая 2013 г., 20:19
Наше приложение rails порождает рабочих, которые являются дочерними процессами, и я должен использовать это, чтобы убить осиротевших рабочих.
 fjsj27 апр. 2015 г., 17:06
это также убивает веб-браузеров, подключающихся к порту
 bob23 мая 2016 г., 13:19
Вот работает один:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9

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

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

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

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

Вы должны попробовать этот код, используя терминал:

$ killall -9 ruby

уничтожение.

lsof -ti:3000 | xargs kill

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

 Zlemini 22 мая 2018 г., 23:58
Вы можете отфильтровать «прослушивающие» порты с помощью:lsof -ti:3000 -sTCP:LISTEN
 rlovtang22 мая 2018 г., 11:45
Также убьет браузер слокальный: 3000 открыть

lsof -i:3000.

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

 Matt Gibson04 окт. 2010 г., 15:19
Хм. Не знаю точно на Леопарде, но попробуй (как корень - это важно, я думаю)lsof -i:3000.
 oma04 окт. 2010 г., 14:58
Я на 10,5 Lepard (обновленный Q). Я не знаю, имеет ли это здесь значение, но lsof не отображает порты. lsof -h (lsof 4.78) слишком загадочен для меня ...

kill $(lsof -t -i:3000)

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

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

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

убить -9 'PID'

 CrsCaballero13 июн. 2019 г., 00:01
Спасибо, ваше решение легче всего читать

С помощьюsindresorhus«sfkill инструмент, вы можете сделать это:

$ fkill :3000

Найти:

[sudo] lsof -i :3000

Убийство:

kill -9 <PID>
 Michael Trouw24 нояб. 2015 г., 13:45
@ Джеймон Холмгрен, почему? что делают оба? и почемуkill <PID> недостаточно / опасно / неполно?
 Beez12 сент. 2018 г., 21:18
Эта очистка важна для процессов Java, я только что испытал. Перезагрузка моей машины устранила проблему после убийства с -9. Буду пытаться -15 дальше.
 Jamon Holmgren17 авг. 2015 г., 01:55
Рекомендую попробоватьkill -15 <PID> прежде чем прибегнуть к-9 для безопасности.
 Joseph Fraley17 янв. 2017 г., 20:13
Я думаю, что этот ответ должен сказать, что-9 делает.
 Jamon Holmgren12 окт. 2016 г., 07:57
@MichaelTrouw почти год спустя, но вот твой ответ. :-)unix.stackexchange.com/a/8918 TL; DRkill -15 дает процессу возможность убирать за собой.
 kilik5230 янв. 2014 г., 13:05
Иногдаlsof -i: порт ничего не покажет. пытатьсяsudo lsof -i: порт.
 niels26 янв. 2017 г., 12:58
Пожалуйста, не просто используйтеkill -9 не думая дважды, и пробуя сначала другие сигналы. Это приведет к немедленному завершению процесса, без очистки после него, возможно, оставив беспорядок или оставив базы данных в несогласованном состоянии ... Попробуйте TERM (по умолчанию дляkill, флаг не нужен) или ВЫЙТИ (kill -3 pid) сначала, по крайней мере, и проверьте, с каким процессом вы имеете дело, перед отправкой KILL.
 Sufian18 окт. 2018 г., 11:12
@MichaelTrouw убить командуMan страница говорит, что «-15» означает «сигнал завершения - разрешить упорядоченное отключение», а «-9» означает «сигнал убийства».

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

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

Найдите PID и убейте процесс.

lsof -ti:3000 | xargs kill

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

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

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

killTcpListen 8080

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

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

Ваш ответ на вопрос