Найти (и убить) процесс блокировки порта 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 ответов
-
вы можете попробовать
netstat
netstat -vanp tcp | grep 3000
-
на macOS El Capitan и новее (или если ваш netstat не поддерживает
-p
), используйтеlsof
sudo lsof -i tcp:3000
-
на в CentOS 7 использовать
netstat -vanp --tcp | grep 3000
ничего выше не работало для меня. Любой другой с моим опытом может попробовать следующее (работал на меня):
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 номером, который вы получите после выполнения первой команды
один из способов убить процесс на порту-использовать библиотеку 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
возможные способы достижения этого:
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
С помощью sindresorhus ' s fkill, вы можете сделать это:
$ fkill :3000
найти и убить:
эта единственная командная строка проста и работает правильно.
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 $@;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 -I@ 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
Шаг 1: Найдите сервер, который работает:
ps aux | grep puma
Шаг 2: убейте этот сервер
Kill -9 [номер сервера]
вы также можете изменить конфигурацию на порте сервера (config / puma.rb) строка 12.
$ port ENV.fetch ("PORT") { 3000 }
до
$ port ENV.fetch ("PORT") { 3001 }
или любой конкретный порт, который вы считаете подходящим. это позволяет избежать необходимости идти на охоту за процессы. вы всегда можете перезагрузить компьютер. также, Когда вы запускаете сервер на другом порту, он обычно убивает первый сервер, который вы открыли.