Знайти (і вбити) процес блокування порту 3000 на Mac


1808

Як знайти (і вбити) процеси, які слухають / використовують мої порти tcp? Я на mac os x.

Іноді після аварії або помилки мій додаток рейки блокує порт 3000. Я не можу його знайти за допомогою ps -ef ...

Коли робиш

rails server

я отримав

Адреса вже використовується - прив'яжіть (2) (Errno :: EADDRINUSE)

Оновлення 2014 року:

Щоб виконати деякі відповіді нижче: Після виконання команд kill, видалення файлу pid може знадобитися rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
Дуже акуратне рішення вбити процес на будь-якому вказаному користувачем порту можна знайти у відповіді @Kevin Suttle нижче. Відтворено тут для нащадків:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584

4
Порт 3000 не є «специфічним для розвитку рейок» - Метеор також працює на 3000, і я впевнений, що є й інші.
gregorvand

@ User456584 «s коментар вище повинен бути загальноприйнятим відповіддю ^^^ Цією функція працювала , щоб вбити багато процеси я вже працюють на порту
Aneuway

Відповіді:


3022
  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
    

22
Дякую! Ваша відповідь породила мій сценарій "death_to 'port" ". (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1

191
Прапор "короткого" до lsof дає вихід, придатний для передачі труб у наступне вбивство:lsof -t -i tcp:1234 | xargs kill
Манав

5
Я поклав це на своє ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillтепер мені просто потрібно набрати, killport 8080і це економить мені кілька секунд
Альфонсо Перес

3
Ще одна порада: не забудьте спробувати sudoперед lsof, якщо ви не бачите жодного результату
Abe Petrillo

4
Ще одна порада - додати -Pдо lsofкоманди так, щоб вихідний порт був видно у висновку:lsof -P -i:3000
Jason Axelson

1874

Знайти:

sudo lsof -i :3000

Убити:

kill -9 <PID>

61
Іноді lsof -i: порт нічого не покаже. спробуйте sudo lsof -i: порт .
kilik52

31
Рекомендуйте спробувати, kill -15 <PID>перш ніж вдаватися до -9безпеки.
Джеймон Холмгрен

7
@Jamon Holmgren чому? що обидва роблять? і чому є kill <PID>недостатньою / небезпечною / неповною?
Майкл Трув

13
@MichaelTrouw майже через рік, але ось ваша відповідь. :-) unix.stackexchange.com/a/8918 TL; DR kill -15надає процесу можливість очиститись після себе.
Джеймон Холмгрен

9
Я думаю, що ця відповідь повинна сказати, що -9робить.
Джозеф Фрейлі

206

Ніщо вище для мене не працювало. Хтось із моїм досвідом міг спробувати наступне (працював для мене):

Виконати:

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

потім перевірте стан повідомленого PID:

ps ax | grep <PID>

нарешті, "настав час":

kill -QUIT <PID>

18
Це насправді здається кращою відповіддю, ніж той, який дав набагато пізніше Філіп Спірідонов, який отримав 277 відгуків проти ваших 9. Ваш був на 6 місяців раніше і має ту саму інформацію з трохи більше пояснень. Справедливості немає ...
Флоріс

Спробуйте kill -TERM(або просто kill) раніше kill -QUIT. Не кожен процес виконує впорядковане відключення на SIGQUIT.
craig65535

159

Однолінійний інструмент для вилучення PID процесу за допомогою порту 3000 та знищення його.

lsof -ti:3000 | xargs kill

Прапор -t видаляє все, окрім PID, з виводу lsof, що дозволяє його легко вбити.


13
Ви можете відфільтрувати «прослуховування» портів за допомогою:lsof -ti:3000 -sTCP:LISTEN
Zlemini

1
Цей метод найкраще працює для мене. Простий один вкладиш, який очищає зайнятий порт. Дякую!
Райан Тренер

137

Найпростіше рішення :

Для одного порту:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Вбийте кілька портів за допомогою однорядкової команди:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ідентифікатор процесу / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

вбити $ (lsof -ti: 3001,3000)

Завершує 82499 та 82500 процесів в одній команді.

Для використання цього в package.jsonсценаріях:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
Це працювало для мене Спасибі :)
DILEEP THOMAS

2
Радий, що це допомогло.
Абхіджіт Сасікумар

113

Цей єдиний командний рядок легко запам’ятати:

npx kill-port 3000

Для більш потужного інструменту з пошуком:

npx fkill-cli


PS: Вони використовують сторонні пакети javascript. npxпоставляється вбудований разом з Node.js.

Джерела: твіт | github


Чи можете ви поділитися деталями щодо встановлення npx за допомогою brew? Я спробував встановити його на моєму Mac High Sierra, 10.13.3, і він не працюватиме.
realPK

@realPK npxпостачається разом npmіз цим node.js, тому це не окремий пакет. Просто оновіть node.js і свої npm версії.
Бруно Лемос

Здебільшого я займаюся Java, ще не піддався Node. Я знайшов інший спосіб вбивства служби, що працює в порту. TY для відповіді.
realPK

5
Потреба в NodeJS та JavaScript, щоб знищити щось, що працює на порту 3000, ймовірно, на рейках ... здається мені занадто великою головою. додавання простої лінії до вашого .bashrc або .zshrc з псевдонімом вирішило б це без потреби в Інтернеті. псевдонім kill3000 = 'lsof -ti: 3000 | xargs kill ', то ви можете зробити: kill3000
Khalil Gharbaoui

Найкраще рішення цієї проблеми .. дякую
Король Райхан

107

Можна використовувати lsof -i:3000.

Це "Список відкритих файлів". Це дає вам список процесів та файлів та портів, які вони використовують.


Я на 10,5 лепдар (оновлений Q). Я не знаю, чи це має значення тут, але lsof не показує порти. lsof -h (lsof 4.78) теж занадто загадковий, я ...
ома

1
Хм. Не знаю напевно про Leopard, але спробуйте ( як root - це важливо, я думаю) lsof -i:3000.
Метт Гібсон

59

У ваших .bash_profile, створити ярлик для terminateпроцесу 3000:

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

Потім зателефонуйте, $terminateякщо він заблокований.


12
Ви можете зробити це досить гнучким для будь-якого порту: github.com/kevinSuttle/dotfiles/commit/…
Кевін

І таке описове ім’я = p
Майкл Петерсон

У мене є щось подібне до цього, але я проходжу в порту. Я назвав свою функцію KP для порту вбивства.
Джозеф Чемберс

58

Щоб примусово вбити подібний процес, використовуйте наступну команду

lsof -n -i4TCP:3000 

Де 3000 - номер порту, на якому працює процес

це повертає ідентифікатор процесу (PID) і запускається

kill -9 "PID"

Замініть PID номером, який ви отримаєте після виконання першої команди

Наприклад, якщо я хочу вбити процес, що працює на порту 8080


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

Це дасть вам лише під, перевірений на MacOS.


10
на MAC знищити всі піди на порт 3000: lsof -P | греп ': 3000' | awk '{print $ 2}' | xargs kill -9
mike clagg

1
може більше одного процесу слухати один і той же порт?
Кріс

Наше рейкове додаток породжує працівників, які є дочірніми процесами, і я маю використовувати це для вбивства дітей-сиріт
Майк Клагг

2
це також вбиває веб-браузерів, що підключаються до порту
fjsj

5
Тут працює одне:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

Виконати в командному рядку OS-X El Captain:

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

Terse варіант lsof повертає просто PID.


28

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

7
Це, безумовно, НЕ найпростіший спосіб. Отримані відповіді не вимагають від вас нічого завантажувати та встановлювати.
Грег Паскваріелло

4
Коли умови будуть виконані, це так просто і легко запам'ятовується. У нас різне визначення «найпростішого», і ця відповідь цілком справедлива і доречна. Можливо, просто не вистачає інструкцій щодо встановлення фріпорту з піп.
Кирило Дюшон-Доріс

під кришкою фріпорт - це просто обгортка, яка дзвонить lsof -t -i:3000.. здається непотрібною.
Корі Голдберг

Це рішення не найпростіше, але воно відповідає 100% тому, про що попросила ОП ... Тож воно є у дійсній дійсності AF
danielrvt

26

Щоб переглянути процеси, що блокують порт:

netstat -vanp tcp | grep 3000

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

kill $(lsof -t -i :3000)


Це не працюватиме на машині Mac, але повертає наступне: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Однак воно буде працювати в більшості дистрибутивів Linux
Мілан Велебіт,

1
@MilanVelebit Насправді він прекрасно працює в моїй машині Mac (Сьєрра). Це добре працює, якщо ваш порт 3000зайнятий. Однак якщо жоден процес не блокує порт, ви отримаєте kill: not enough argumentsпомилку.
Генріх

Це просто дивно, у мене два Macs (обидва Висока Сьєрра Тхо), я пам'ятаю, що виконував ці команди на обох (старі звички), і я точно знаю, що вони не виконуються. Я просто спробував це ще раз на своїй машині, знаючи, що порт зайнятий, така ж помилка. : /
Мілан Велебіт

Ви отримали дійсний PID для запуску netstat -vanp tcp | grep 3000для вашого порту, який займає?
Генріх

1
Я спробував це в обох bashі в zshоболонці. Добре працює для мене. Не впевнений, чому це не працює для вас. Може бути, щось із Високою Сьєррою? Я поняття не маю: /
Генрі

24

Знайдіть відкрите з'єднання

lsof -i -P | grep -i "слухати"

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

вбити -9 'PID'


20

Знайдіть і вбийте:

Цей єдиний командний рядок простий і працює правильно.

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

14

Можливі шляхи досягнення цього:

верх

Верхня команда - це традиційний спосіб перегляду використання ресурсів вашої системи та перегляду процесів, які займають найбільше системних ресурсів. Вгорі відображається перелік процесів, вгорі яких використовується найбільше процесора.

пс

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

10

lsof -i tcp:port_number - перерахує процес, що працює на цьому порту

kill -9 PID - вб'є процес

у вашому випадку це буде

lsof -i tcp:3000 з терміналу знайдіть PID процесу

kill -9 PID



5

Додати до ~/.bash_profile:

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

Потім source ~/.bash_profileі біжи

killTcpListen 8080



4

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

4

Я зробив невелику функцію для цього додайте його в файл гс ( .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 щоб убити сервер рейкових систем (замінивши 3000 на будь-який порт, на якому він працює)

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


Мені довелося зробити зворотний нахил, \$PORTщоб повідомлення відображалося правильно. Інакше чудово працює!
ясен

4

Вбивати кілька портів.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Сподіваюся, що це допоможе!


1

Ви повинні спробувати це. Ця методика незалежна від ОС.

Збоку вашої програми є папка під назвою tmp, всередині - ще одна папка під назвою pids. Цей файл містить файл pid-сервера. Просто видаліть цей файл. порт автоматично вбиває себе.

Я думаю, що це простий шлях.


1

Ось допоміжна функція 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


0

Якщо ви хочете код безкоштовно - відкрийте диспетчера дій і змушуйте вбити вузол :)



-1

Крок 1: Знайдіть запущений сервер: ps aux | grep puma Крок 2: Вбийте цей сервер. Убийте -9 [номер сервера]


-1

В ОС Mac

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
Це було опубліковано як коментар 5 років тому, а синхронні відповіді розміщувались кілька разів.
Жиль Гуайларде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.