บริการของฉันขัดข้องเมื่อเริ่มต้นด้วยคลาสสิก:
java.rmi.server.ExportException: Listen failed on port: 9999
ฉันจะหากระบวนการฆ่ามันได้อย่างไร?
บริการของฉันขัดข้องเมื่อเริ่มต้นด้วยคลาสสิก:
java.rmi.server.ExportException: Listen failed on port: 9999
ฉันจะหากระบวนการฆ่ามันได้อย่างไร?
คำตอบ:
เพียงเปิดเชลล์คำสั่งแล้วพิมพ์ (บอกว่าพอร์ตของคุณคือ 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
nestat -aon | findstr 123456
ค้นหา 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)
หมายเหตุ: คุณอาจต้องได้รับอนุญาตเพิ่มเติม (เรียกใช้จากผู้ดูแลระบบ) เพื่อฆ่ากระบวนการบางอย่าง
หากคุณต้องการดำเนินการโดยใช้โปรแกรมคุณสามารถใช้ตัวเลือกบางอย่างที่มอบให้คุณดังต่อไปนี้ในสคริปต์ 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 แทนและฆ่ากระบวนการที่ไม่ถูกต้อง
หลังจากเล่นซอกับสคริปต์ฉันก็มาถึงการกระทำนี้ คัดลอกและบันทึกเป็นไฟล์. bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
เปลี่ยน 'find "3306"' ในหมายเลขพอร์ตที่ต้องว่าง จากนั้นเรียกใช้ไฟล์ในฐานะผู้ดูแลระบบ มันจะฆ่ากระบวนการทั้งหมดที่ทำงานบนพอร์ตนี้
คำสั่ง:
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 โดยใช้หมายเลขพอร์ต
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
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