ค้นหา (และฆ่า) กระบวนการล็อกพอร์ต 3000 บน Mac


1809

ฉันจะค้นหากระบวนการ (และฆ่า) ที่ฟัง / ใช้พอร์ต 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 }
คัด

4
พอร์ต 3000 ไม่ใช่ 'การพัฒนาที่เจาะจงอย่างยิ่ง' - Meteor ก็ทำงานบน 3000 เช่นกันและฉันแน่ใจว่ามีคนอื่นด้วย
gregorvand

ความคิดเห็นของ @ user456584 ด้านบนควรเป็นคำตอบที่ยอมรับ ^^^ ฟังก์ชั่นนี้ทำงานเพื่อฆ่ากระบวนการหลายอย่างที่ฉันเคยทำงานบนพอร์ต
Aneuway

คำตอบ:


3024
  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
ธง "terse" เพื่อ lsof สร้างผลลัพธ์ที่เหมาะสมสำหรับการวางท่อเพื่อการฆ่าครั้งต่อไป:lsof -t -i tcp:1234 | xargs kill
Manav

5
ฉันได้ใส่สิ่งนี้ลงในของฉัน~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillดังนั้นตอนนี้ฉันแค่ต้องพิมพ์killport 8080และมันช่วยฉันไม่กี่วินาที
Alfonso Pérez

3
เคล็ดลับอีกอย่างหนึ่ง: อย่าลืมลองsudoก่อนที่จะถึงหากคุณไม่เห็นผลลัพธ์ใด ๆ
Abe Petrillo

4
เคล็ดลับก็คือการเพิ่ม-Pไปยังlsofคำสั่งเพื่อให้พอร์ตดิบสามารถมองเห็นได้ในการส่งออก:lsof -P -i:3000
เจสัน Axelson

1874

หา:

sudo lsof -i :3000

ฆ่า:

kill -9 <PID>

61
บางครั้งlsof -i: พอร์ตจะไม่แสดงอะไรเลย ลองsudo -i lsof:
kilik52

31
แนะนำให้ลองkill -15 <PID>ก่อนที่จะหันไปใช้เพื่อ-9ความปลอดภัย
Jamon Holmgren

7
@Jamon Holmgren ทำไมล่ะ ทั้งสองทำอะไร และทำไมถึงkill <PID>ไม่เพียงพอ / เป็นอันตราย / ไม่สมบูรณ์?
Michael Trouw

13
@MichaelTrouw เกือบหนึ่งปีต่อมา แต่นี่คือคำตอบของคุณ :-) unix.stackexchange.com/a/8918 TL; DR เปิดkill -15โอกาสให้กระบวนการล้างตัวเอง
Jamon Holmgren

9
ฉันคิดว่าคำตอบนี้ควรพูดในสิ่งที่-9ทำ
Joseph Fraley

206

ไม่มีอะไรข้างต้นทำงานให้ฉัน ใครก็ตามที่มีประสบการณ์ของฉันสามารถลองต่อไปนี้ (ทำงานให้ฉัน):

วิ่ง:

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

จากนั้นตรวจสอบสถานะของ PID ที่รายงาน:

ps ax | grep <PID>

ในที่สุด "เริ่มต้นด้วยมัน":

kill -QUIT <PID>

18
นี่ดูเหมือนจะเป็นคำตอบที่ดีกว่าคนที่ให้ฟิลิปโปนิโดนอฟในภายหลังซึ่งมี 277 upvotes เทียบกับ 9 ของคุณคุณเป็น 6 เดือนก่อนหน้านี้และมีข้อมูลเดียวกันพร้อมคำอธิบายเพิ่มเติมอีกเล็กน้อย ไม่มีความยุติธรรม ...
Floris

ลองkill -TERM(หรือเพียงแค่kill) kill -QUITก่อน ไม่ใช่ทุกกระบวนการที่จะทำการปิดอย่างเป็นระบบใน SIGQUIT
craig65535

159

หนึ่งซับเพื่อแยก PID ของกระบวนการโดยใช้พอร์ต 3000 และฆ่ามัน

lsof -ti:3000 | xargs kill

แฟล็ก -t ลบทุกอย่างยกเว้น PID จากเอาต์พุต lsof ทำให้ง่ายต่อการฆ่า


13
คุณสามารถกรองพอร์ต " lsof -ti:3000 -sTCP:LISTEN
Listen

1
วิธีนี้ใช้ได้ผลดีที่สุดสำหรับฉัน ซับง่าย ๆ ที่ล้างพอร์ตไม่ว่าง ขอบคุณ!
Ryan Trainor

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 (ID กระบวนการ / 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
ดีใจที่มันช่วย
Abhijith Sasikumar

113

บรรทัดคำสั่งเดียวนี้ง่ายต่อการจดจำ:

npx kill-port 3000

สำหรับเครื่องมือที่มีประสิทธิภาพยิ่งขึ้นพร้อมการค้นหา:

npx fkill-cli


PS: พวกเขาใช้แพ็คเกจจาวาสคริปต์ของบุคคลที่สาม npxมาพร้อมกับ Node.js

แหล่งที่มา: ทวีต | GitHub


คุณสามารถแชร์รายละเอียดเกี่ยวกับการติดตั้ง npx โดยใช้ brew ได้หรือไม่? ฉันลองติดตั้งลงบน Mac High Sierra, 10.13.3 แล้วมันใช้ไม่ได้
realPK

@realPK npxมาพร้อมกับnpmสิ่งที่มาพร้อมnode.jsดังนั้นจึงไม่ใช่แพ็คเกจแยก เพียงอัพเกรด node.js และเวอร์ชัน npm ของคุณ
Bruno Lemos

ฉันทำจาวาส่วนใหญ่ยังไม่ได้สัมผัสกับโหนดเลย ฉันพบวิธีที่แตกต่างในการฆ่าบริการที่ทำงานบนพอร์ต TY สำหรับการตอบสนอง
realPK

5
ความต้องการ NodeJS และ JavaScript เพื่อฆ่าบางสิ่งที่ทำงานบนพอร์ต 3000 อาจเป็นทางรถไฟ ... ดูเหมือนว่าจะมีค่าใช้จ่ายมากเกินไปสำหรับฉัน การเพิ่มบรรทัดอย่างง่าย ๆ ไปยัง. bashrc หรือ. zshrc ของคุณด้วยนามแฝงจะแก้ปัญหาโดยไม่จำเป็นต้องใช้อินเทอร์เน็ต นามแฝง kill3000 = 'lsof -ti: 3000 | xargs kill 'จากนั้นคุณสามารถทำได้: kill3000
Khalil Gharbaoui

ทางออกที่ดีที่สุดของปัญหานี้ .. ขอบคุณ
King Rayhan

107

lsof -i:3000คุณสามารถใช้

นั่นคือ "รายการไฟล์ที่เปิด" สิ่งนี้ให้รายการของกระบวนการและไฟล์และพอร์ตที่ใช้


ฉันใช้ 10.5 lepard (อัปเดต Q) ฉันไม่รู้ว่ามันสำคัญที่นี่ แต่ lsof ไม่แสดงพอร์ต lsof -h (lsof 4.78) มันคลุมเครือเกินไปฉันด้วย ...
oma

1
อืมมม ไม่ทราบว่าในเสือดาว แต่พยายาม ( เป็นราก - lsof -i:3000ที่สำคัญผมคิดว่า)
Matt Gibson

59

ในของคุณ.bash_profileสร้างทางลัดสำหรับterminateกระบวนการ 3000:

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

จากนั้นโทร$terminateถ้ามันถูกบล็อก


12
คุณสามารถทำให้มันมีความยืดหยุ่นเพียงพอสำหรับพอร์ตใด ๆ : github.com/kevinSuttle/dotfiles/commit/ …
Kevin Suttle

และชื่อที่สื่อความหมายเช่นนี้ = p
Michael Peterson

ฉันมีสิ่งที่คล้ายกัน แต่ฉันผ่านในพอร์ต ฉันตั้งชื่อฟังก์ชัน KP ของฉันสำหรับพอร์ตฆ่า
โจเซฟ Chambers

58

หากต้องการฆ่ากระบวนการอย่างรุนแรงให้ใช้คำสั่งต่อไปนี้

lsof -n -i4TCP:3000 

โดยที่ 3000 คือหมายเลขพอร์ตที่กระบวนการกำลังทำงาน

สิ่งนี้จะส่งคืนรหัสกระบวนการ (PID) และเรียกใช้

kill -9 "PID"

แทนที่ PID ด้วยหมายเลขที่คุณได้รับหลังจากรันคำสั่งแรก

สำหรับอินสแตนซ์ถ้าฉันต้องการฆ่ากระบวนการทำงานบนพอร์ต 8080


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

นี่จะให้ pid ที่คุณทดสอบบน MacOS


10
บน MAC ฆ่า pids ทั้งหมดที่พอร์ต 3000: lsof -P | grep ': 3000' | awk '{พิมพ์ $ 2}' | xargs kill -9
mike clagg

1
มากกว่าหนึ่งกระบวนการสามารถฟังพอร์ตเดียวกันได้หรือไม่
กริช

แอพพลิเคชั่นของเราวางไข่คนงานซึ่งเป็นกระบวนการของเด็กและฉันต้องใช้สิ่งนี้เพื่อฆ่าคนงานกำพร้า
ไมค์ clagg

2
นอกจากนี้ยังฆ่าเว็บเบราว์เซอร์ที่เชื่อมต่อกับพอร์ตด้วย
fjsj

5
นี่คือการทำงานที่หนึ่ง:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
บ๊อบ

29

ดำเนินการในบรรทัดคำสั่งบน OS-X El Captain:

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

ตัวเลือก Terse ของ lsof ส่งคืนเฉพาะ PID


28

อีกวิธีหนึ่งในการฆ่ากระบวนการบนพอร์ตคือการใช้ไลบรารีหลาม: 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
นั่นไม่ใช่วิธีที่ง่ายที่สุด คำตอบที่ upvoted ไม่ต้องการให้คุณดาวน์โหลดและติดตั้งอะไร
Greg Pasquariello

4
เมื่อตรงตามข้อกำหนดเบื้องต้นสิ่งนี้จะง่ายและจดจำได้ง่าย เรามีคำจำกัดความที่แตกต่างกันของ "ง่ายที่สุด" และคำตอบนี้ถูกต้องสมบูรณ์และเหมาะสม อาจเป็นเพียงแค่ขาดคำแนะนำในการติดตั้งฟรีพอร์ตด้วย pip
Cyril Duchon-Doris

ภายใต้ประทุนฟรีพอร์ตเป็นเพียงเสื้อคลุมที่เรียกได้ว่าlsof -t -i:3000.. ไม่จำเป็นเลย
Corey Goldberg

วิธีนี้ไม่ใช่วิธีที่ง่ายที่สุด แต่เป็นไปตาม 100% กับสิ่งที่ OP ถาม ... ดังนั้นมันจึงอยู่ในการกระทำที่ถูกต้อง 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]มันจะทำงานใน distros linux ส่วนใหญ่
Milan Velebit

1
@MilanVelebit ที่จริงมันทำงานได้อย่างสมบูรณ์แบบในเครื่อง Mac ของฉัน (เซีย) มันทำงานได้ดีถ้าพอร์ตของคุณ3000ถูกครอบครอง อย่างไรก็ตามหากไม่มีกระบวนการใดปิดกั้นพอร์ตคุณจะได้รับkill: not enough argumentsข้อผิดพลาด
เฮนรี่

นั่นเป็นเรื่องแปลกประหลาดฉันมี Mac สองเครื่อง (ทั้ง High Sierra สรรพสินค้าใหญ่) ฉันจำได้ว่ารันคำสั่งเหล่านั้นทั้งสอง (นิสัยเก่า) และฉันรู้ว่าพวกเขาไม่ทำงาน ฉันเพิ่งลองอีกครั้งบนเครื่องของฉันเพราะรู้ว่าพอร์ตถูกครอบครองข้อผิดพลาดเดียวกัน : /
Milan Velebit

คุณได้รับ PID ที่ถูกต้องในการทำงานnetstat -vanp tcp | grep 3000สำหรับพอร์ตที่คุณครอบครองหรือไม่
เฮนรี่

1
ฉันลองทั้งในbashและzshเปลือก ทำงานได้ดีสำหรับฉัน ไม่แน่ใจว่าทำไมมันไม่ทำงานสำหรับคุณ อาจเป็นเรื่องของ High Sierra บ้าง ฉันไม่มีความคิด: /
เฮนรี่

24

ค้นหาการเชื่อมต่อที่เปิดอยู่

lsof -i -P | grep -i "ฟัง"

ฆ่าตาม ID กระบวนการ

kill -9 'PID'


20

ค้นหาและฆ่า:

บรรทัดคำสั่งเดียวนี้ใช้งานง่ายและทำงานอย่างถูกต้อง

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

14

วิธีที่เป็นไปได้เพื่อให้บรรลุสิ่งนี้:

ด้านบน

คำสั่ง 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 

10

lsof -i tcp:port_number - จะแสดงรายการกระบวนการที่ทำงานบนพอร์ตนั้น

kill -9 PID - จะฆ่ากระบวนการ

ในกรณีของคุณมันจะเป็น

lsof -i tcp:3000 จากเทอร์มินัลของคุณค้นหา PID ของกระบวนการ

kill -9 PID


10

สองคำสั่งเหล่านี้จะช่วยคุณค้นหาและฆ่ากระบวนการเซิร์ฟเวอร์

  1. lsof -wni tcp: 3000
  2. kill -9 pid

Aashiah ของฉันมีความสุข
Saif chaudhry

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เพื่อแสดง pid ของกระบวนการที่กำลังฟังอยู่เท่านั้น การรวมสิ่งนี้เข้ากับ-tรูปแบบ terse คุณสามารถฆ่ากระบวนการโดยอัตโนมัติ:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

ฉันทำฟังก์ชั่นเล็ก ๆ น้อย ๆ นี้เพิ่มเข้าไปในแฟ้ม 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เพื่อฆ่าเซิร์ฟเวอร์รางของคุณ (แทน 3000 สำหรับพอร์ตใดก็ได้ที่ทำงานอยู่)

หากล้มเหลวคุณสามารถพิมพ์kill -9 $(cat tmp/pids/server.pid)จากไดเรกทอรีหลักของ Rails


ฉันต้องแบ็กสแลช\$PORTเพื่อให้ข้อความแสดงอย่างถูกต้อง มิฉะนั้นใช้งานได้ดี!
ashwood

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

นี่คือฟังก์ชันทุบตีผู้ช่วยที่จะฆ่ากระบวนการหลายอย่างด้วยชื่อหรือพอร์ต

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: ฆ่าเซิร์ฟเวอร์เหล่านั้น Kill -9 [หมายเลขเซิร์ฟเวอร์]


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.