ค้นหา PID ของกระบวนการที่ใช้พอร์ตบน Windows


107

บริการของฉันขัดข้องเมื่อเริ่มต้นด้วยคลาสสิก:

java.rmi.server.ExportException: Listen failed on port: 9999

ฉันจะหากระบวนการฆ่ามันได้อย่างไร?


โซลูชันทางเลือกที่ซับซ้อนมากขึ้นที่นี่: stackoverflow.com/questions/48198/…
Thomas

คำตอบ:


217

เพียงเปิดเชลล์คำสั่งแล้วพิมพ์ (บอกว่าพอร์ตของคุณคือ 123456):

netstat -a -n -o | find "123456"

คุณจะเห็นทุกสิ่งที่คุณต้องการ

ส่วนหัว ได้แก่ :

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

ที่นี่ฉันจะรับเฉพาะ pid ได้อย่างไรเนื่องจากจะส่งคืนรายละเอียดทั้งหมด
Gobi M

วิธีรับแบบฟอร์ม PID ด้านบนผลลัพธ์
Chinya

11
หรือnestat -aon | findstr 123456
ROMANIA_engineer

วิธีง่ายๆในการบรรลุสิ่งนี้บน windows แสดงให้เห็นในคำถามนี้ - stackoverflow.com/questions/48198/…
Dracontis

4
สำหรับ windows / cygwin อาจเป็น netstat -a -n -o | grep "123456"
WebComer

87

ค้นหา PID ของกระบวนการที่ใช้พอร์ตบน Windows (เช่นพอร์ต: "9999")

netstat -aon | find "9999"

-a แสดงการเชื่อมต่อและพอร์ตการฟังทั้งหมด

-o แสดง ID กระบวนการเป็นเจ้าของที่เชื่อมโยงกับการเชื่อมต่อแต่ละครั้ง

-n แสดงที่อยู่และหมายเลขพอร์ตในรูปแบบตัวเลข

เอาท์พุต:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

จากนั้นฆ่ากระบวนการโดย PID

taskkill /F /PID 15776

/F - ระบุเพื่อยุติกระบวนการอย่างมีผลบังคับ (es)

หมายเหตุ: คุณอาจต้องได้รับอนุญาตเพิ่มเติม (เรียกใช้จากผู้ดูแลระบบ) เพื่อฆ่ากระบวนการบางอย่าง


เหตุใด netstat จึงไม่ออกเว้นแต่คุณจะให้ค่าสถานะ n
Jared Beach

2
@JaredBeach - กำลังรอการแก้ปัญหาชื่อ DNS แบบผกผันดังนั้นในที่สุดก็จะเสร็จสิ้นหลังจากหมดเวลา หากสิ่งนี้ค้างบนIP ภายในแสดงว่ามีปัญหากับเซิร์ฟเวอร์ DNS ภายในของคุณ
Steve Friedl

8

หากคุณต้องการดำเนินการโดยใช้โปรแกรมคุณสามารถใช้ตัวเลือกบางอย่างที่มอบให้คุณดังต่อไปนี้ในสคริปต์ PowerShell:

$processPID =  $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID

อย่างไรก็ตาม; โปรดทราบว่ายิ่งคุณแม่นยำมากเท่าไหร่ผลลัพธ์ PID ของคุณก็จะแม่นยำมากขึ้นเท่านั้น หากคุณรู้ว่าโฮสต์ใดที่พอร์ตควรจะอยู่คุณสามารถ จำกัด ให้แคบลงได้มาก netstat -aon | findstr "0.0.0.0:9999"จะส่งคืนแอปพลิเคชันเดียวเท่านั้นและส่วนใหญ่น่าจะเป็นแอปพลิเคชันที่ถูกต้อง การค้นหาเฉพาะหมายเลขพอร์ตเท่านั้นที่อาจทำให้คุณส่งคืนกระบวนการที่เกิดขึ้นได้9999เช่นนี้:

TCP    0.0.0.0:9999                        0.0.0.0:0       LISTENING       15776
UDP    [fe80::81ad:9999:d955:c4ca%2]:1900  *:*                             12331

ผู้สมัครที่เป็นไปได้มากที่สุดมักจะจบลงก่อน แต่ถ้ากระบวนการสิ้นสุดลงก่อนที่คุณจะเรียกใช้สคริปต์ของคุณคุณอาจลงเอยด้วย PID 12331 แทนและฆ่ากระบวนการที่ไม่ถูกต้อง


4

หลังจากเล่นซอกับสคริปต์ฉันก็มาถึงการกระทำนี้ คัดลอกและบันทึกเป็นไฟล์. bat:

FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i

เปลี่ยน 'find "3306"' ในหมายเลขพอร์ตที่ต้องว่าง จากนั้นเรียกใช้ไฟล์ในฐานะผู้ดูแลระบบ มันจะฆ่ากระบวนการทั้งหมดที่ทำงานบนพอร์ตนี้


4

คำสั่ง:

netstat -aon | findstr 4723

เอาท์พุต:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

ตอนนี้ตัด ID กระบวนการ "10396" โดยใช้forคำสั่งใน Windows

คำสั่ง:

for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

เอาท์พุต:

10396

หากคุณต้องการตัดตัวเลข 4 ของค่าหมายความว่า "LISTENING" ให้สั่งใน Windows

คำสั่ง:

for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

เอาท์พุต:

การฟัง


ข้อเสนอแนะสำหรับการกรอง PID ที่ไม่ซ้ำกันเนื่องจากบางครั้งคำสั่งจะส่งคืนกระบวนการเดียวกันหลายครั้งหรือไม่
Krzysztof Krzeszewski

2

สิ่งนี้ช่วยในการค้นหา PID โดยใช้หมายเลขพอร์ต

lsof -i tcp:port_number

1
หลังจากพิมพ์คำสั่งฉันได้รับ'lsof' is not recognized as an internal or external command.
Srinivas

ทำงานใน Linux
Mahaveer Jangir

3
คำถามนี้เกี่ยวกับ Windows
acaruci

0

PowerShell (เข้ากันได้กับ Core) หนึ่งซับเพื่อลดความยุ่งยากในสถานการณ์ลอกเลียนแบบ:

netstat -aon | Select-String 8080 | ForEach-Object { $_ -replace '\s+', ',' } | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID') | ForEach-Object { $portProcess = Get-Process | Where-Object Id -eq $_.PID; $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; Write-Output $_ } | Sort-Object ProcessName, State, Protocol, AddressLocal, AddressForeign | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign | Format-Table

เอาท์พุต:

ProcessName State     Protocol AddressLocal AddressForeign
----------- -----     -------- ------------ --------------
System      LISTENING TCP      [::]:8080    [::]:0
System      LISTENING TCP      0.0.0.0:8080 0.0.0.0:0

รหัสเดียวกันเป็นมิตรกับนักพัฒนา:

$Port = 8080

# Get PID's listening to $Port, as PSObject
$PidsAtPortString = netstat -aon `
  | Select-String $Port
$PidsAtPort = $PidsAtPortString `
  | ForEach-Object { `
      $_ -replace '\s+', ',' `
  } `
  | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID')

# Enrich port's list with ProcessName data
$ProcessesAtPort = $PidsAtPort `
  | ForEach-Object { `
    $portProcess = Get-Process `
      | Where-Object Id -eq $_.PID; `
    $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; `
    Write-Output $_;
  }

# Show output
$ProcessesAtPort `
  | Sort-Object    ProcessName, State, Protocol, AddressLocal, AddressForeign `
  | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign `
  | Format-Table
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.