Ответ 1
-
Вы можете попробовать
netstat
netstat -vanp tcp | grep 3000
-
Для macOS El Capitan и новее (или если ваш netstat не поддерживает
-p
), используйтеlsof
sudo lsof -i tcp:3000
-
Для Centos 7 использовать
netstat -vanp --tcp | grep 3000
Как мне найти (и уничтожить) процессы, которые прослушивают/используют мои порты tcp? Я на Mac OS X
Иногда, после сбоя или некоторой ошибки, мое приложение rails блокирует порт 3000. Я не могу найти его с помощью ps -ef...
При выполнении
rails server
я получил
Адрес уже используется - bind (2) (Errno :: EADDRINUSE)
2014 обновление:
Для завершения некоторых ответов ниже: После выполнения команд kill может потребоваться удаление файла pid: rm ~/mypath/myrailsapp/tmp/pids/server.pid
Вы можете попробовать netstat
netstat -vanp tcp | grep 3000
Для macOS El Capitan и новее (или если ваш netstat не поддерживает -p
), используйте lsof
sudo lsof -i tcp:3000
Для 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>
Один лайнер для извлечения PID процесса с использованием порта 3000 и его уничтожения.
lsof -ti:3000 | xargs kill
Флаг -t удаляет все, кроме PID, с выхода lsof, что позволяет легко его убить.
Вы можете использовать lsof -i:3000
.
Это "Список открытых файлов". Это дает вам список процессов и файлов и портов, которые они используют.
Эту единственную командную строку легко запомнить:
npx kill-port 3000
Для более мощного инструмента с поиском:
npx fkill-cli
PS: они используют сторонние пакеты javascript. npx
поставляется с Node.js.
В .bash_profile
создайте ярлык для terminate
процесса 3000:
terminate(){
lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
}
Затем вызовите $terminate
, если он заблокирован.
Чтобы принудительно убить такой процесс, используйте следующую команду
lsof -n -i4TCP:3000
Где 3000 - номер порта, на котором запущен процесс
это возвращает идентификатор процесса (PID) и запустить
kill -9 "PID"
Замените PID на число, которое вы получите после выполнения первой команды
Самое простое решение:
Для одного порта:
kill $(lsof -ti:3000) //3000 is the port to be freed
Убить несколько портов с помощью однострочной команды:
kill $(lsof -ti:3000,3001) //3000 and 3001 are the ports to be freed
lsof -ti:3000
82500 (идентификатор процесса)
lsof -ti:3001
82499
lsof -ti:3001,3000
82499 82500
kill $(lsof -ti:3001,3000)
Завершает процессы 82499 и 82500 одной командой.
Вы также можете использовать это в скриптах package.json
:
"scripts": {
"start": "kill $(lsof -ti:3000,3001) && npm start"
}
lsof -P | grep ':3000' | awk '{print $2}'
Это даст вам только 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.
Чтобы просмотреть процессы, блокирующие порт:
netstat -vanp tcp | grep 3000
Чтобы убить процессы, блокирующие порт:
kill $(lsof -t -i :3000)
Найти открытое соединение
lsof -i -P | grep -i "слушать"
Убить по идентификатору процесса
kill -9 'PID'
Найдите PID и убейте процесс.
lsof -ti:3000 | xargs kill
Найди и убей:
Эта единственная командная строка проста и работает правильно.
kill -9 $(lsof -ti tcp:3000)
Возможные способы достижения этого:
верхний
Верхняя команда - это традиционный способ просмотра использования ваших системных ресурсов и просмотра процессов, которые занимают большинство системных ресурсов. В верхней части отображается список процессов, в которых используются самые популярные процессоры.
пс
Команда 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
Добавить в ~/.bash_profile
:
function killTcpListen () {
kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}
Затем source ~/.bash_profile
и запустите
killTcpListen 8080
Используя инструмент sindresorhus fkill, вы можете сделать это:
$ fkill :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
, вы можете автоматически -t
процесс:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
Эти две команды помогут вам найти и убить процесс сервера
- lsof -wni tcp: 3000
- убить -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)
из корневого каталога 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 $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 -h
Использование этой команды для поиска порта
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
В вашем случае введите
lsof -i :3000
Если вам нужен свободный код, откройте менеджер активности и принудительно уничтожьте узел :)
Используйте следующую команду, чтобы kill $(lsof -t -i:3000)
процесс на порте 3000 kill $(lsof -t -i:3000)
Вы можете попробовать это
netstat -vanp tcp | grep 3000
Я использую это:
cat tmp/pids/server.pid | pbcopy
затем
kill -9 'paste'