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

26 ответов


  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>

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

Run:

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

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

ps ax | grep <PID>

наконец, "уходи с ним":

kill -QUIT <PID>

ОДН-вкладыш для того чтобы извлечь ПИД процесса используя порт 3000 и убить его.

lsof -ti:3000 | xargs kill

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


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

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


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

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

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


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

lsof -n -i4TCP:3000 

где 3000-номер порта, на котором выполняется процесс

это возвращает идентификатор процесса(PID) и беги!--3-->

kill -9 "PID"

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

For Instance, if I want kill the process running on port 8080


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

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


один из способов убить процесс на порту-использовать библиотеку 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

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

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

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


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

npx kill-port 3000

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

npx fkill-cli


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

источники: Твитнуть | github


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

lsof-i-P / grep-i "слушайте"

убить ID процесса

убить -9 'PID'


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

top

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

ps

команда 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 

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

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

затем source ~/.bash_profile и работать

killTcpListen 8080



найти и убить:

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

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

для просмотра процессов, блокирующих порт:

netstat -vanp tcp | grep 3000

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

kill $(lsof -t -i :3000)


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

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

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

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

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


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

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

Я думаю, что это легкий путь.


вот вспомогательная функция bash, чтобы убить несколько процессов по имени или Порту

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 }'|\
  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 -h

использование этой команды для поиска порта

-i i   select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]

в вашем случае введите

lsof -i :3000

Если ничего из вышеперечисленного не работает, попробуйте:

lsof -n -i4TCP:3000

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


вы также можете изменить конфигурацию на порте сервера (config / puma.rb) строка 12.

$ port ENV.fetch ("PORT") { 3000 }

до

$ port ENV.fetch ("PORT") { 3001 }

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


вы должны попробовать этот код с помощью терминала:

$ killall -9 ruby