Layanan saya macet saat memulai dengan yang klasik:
java.rmi.server.ExportException: Listen failed on port: 9999
Bagaimana saya dapat menemukan proses untuk membunuhnya?
Layanan saya macet saat memulai dengan yang klasik:
java.rmi.server.ExportException: Listen failed on port: 9999
Bagaimana saya dapat menemukan proses untuk membunuhnya?
Jawaban:
Cukup buka shell perintah dan ketik (katakanlah port Anda adalah 123456):
netstat -a -n -o | find "123456"
Anda akan melihat semua yang Anda butuhkan.
Headernya adalah:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Temukan PID dari proses yang menggunakan port di Windows (mis. Port: "9999")
netstat -aon | find "9999"
-a
Menampilkan semua koneksi dan port mendengarkan.
-o
Menampilkan ID proses kepemilikan yang terkait dengan setiap koneksi.
-n
Menampilkan alamat dan nomor port dalam bentuk numerik.
Keluaran:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Kemudian matikan proses dengan PID
taskkill /F /PID 15776
/F
- Menentukan untuk secara paksa menghentikan proses.
Catatan: Anda mungkin memerlukan izin tambahan (dijalankan dari administrator) untuk menghentikan beberapa proses tertentu
Jika Anda ingin melakukan ini secara terprogram, Anda dapat menggunakan beberapa opsi yang diberikan kepada Anda sebagai berikut dalam skrip PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Namun; Sadarilah bahwa semakin akurat Anda, semakin akurat hasil PID Anda. Jika Anda tahu di host mana port seharusnya berada, Anda dapat mempersempitnya banyak. netstat -aon | findstr "0.0.0.0:9999"
hanya akan mengembalikan satu aplikasi dan kemungkinan besar yang benar. Hanya mencari di nomor port dapat menyebabkan Anda mengembalikan proses yang kebetulan ada 9999
di dalamnya, seperti ini:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
Kandidat yang paling mungkin biasanya berakhir pertama, tetapi jika proses telah berakhir sebelum Anda menjalankan skrip Anda, Anda mungkin berakhir dengan PID 12331 dan mematikan proses yang salah.
Setelah beberapa mengutak-atik skrip, saya sampai pada tindakan ini. Salin dan simpan dalam file .bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Ubah 'find "3306"' di nomor port yang harus bebas. Kemudian jalankan file tersebut sebagai administrator. Ini akan mematikan semua proses yang berjalan di port ini.
Perintah:
netstat -aon | findstr 4723
Keluaran:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Sekarang potong ID proses, "10396", menggunakan for
perintah di Windows.
Perintah:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Keluaran:
10396
Jika Anda ingin memotong angka ke-4 dari nilai berarti "MENDENGARKAN" maka perintah di Windows.
Perintah:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Keluaran:
MENDENGARKAN
Ini membantu menemukan PID menggunakan nomor port.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
PowerShell (kompatibel dengan Core) satu baris untuk memudahkan skenario copypaste:
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
Keluaran:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Kode yang sama, ramah pengembang:
$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