Найти (и убить) процесс блокировки порта 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 ответов
Ты можешь попробовать
netstat
netstat -vanp tcp | grep 3000
Для macOS El Capitan и новее (или если ваш netstat не поддерживает
-p
), используйтеlsof
sudo lsof -i tcp:3000
Для Centos 7 использовать
netstat -vanp --tcp | grep 3000
Самое простое решение: убить несколько портов с помощью одной строки.
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
Однострочное извлечение PID процесса с использованием порта 3000 и его уничтожение.
lsof -ti:3000 | xargs kill
Флаг -t удаляет все, кроме PID, из вывода lsof, что упрощает его уничтожение.
Ты можешь использовать lsof -i:3000
,
Это "Список открытых файлов". Это дает вам список процессов и какие файлы и порты они используют.
Чтобы принудительно убить такой процесс, используйте следующую команду
lsof -n -i4TCP:3000
Где 3000 - номер порта, на котором запущен процесс
это возвращает идентификатор процесса (PID) и запуска
kill -9 "PID"
Замените PID на число, которое вы получите после выполнения первой команды
В вашем .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
Эти две команды помогут найти и убить серверный процесс.
- lsof -wni tcp:3000
- 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
просто напишите в терминале
sudo kill -9 $(lsof -i :3000 -t)
надеюсь, это работа.
Вы должны попробовать это, этот метод не зависит от ОС.
В стороне вашего приложения есть папка с именем tmp, внутри которой есть еще одна папка с именем pids. Этот файл содержит файл pid сервера. Просто удалите этот файл. Порт автоматически убивает себя.
Я думаю, что это простой способ.