Temukan PID dari proses yang menggunakan porta di Windows

Jawaban:

217

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
Thomas
sumber
di sini bagaimana saya hanya mendapatkan pid, karena mengembalikan seluruh detail
Gobi M
cara mendapatkan satu-satunya formulir PID hasil di atas
Chinya
10
atau,nestat -aon | findstr 123456
ROMANIA_engineer
Cara mudah untuk mencapai ini di windows ditunjukkan dalam pertanyaan ini - stackoverflow.com/questions/48198/…
Dracontis
4
untuk windows / cygwin, mungkin netstat -a -n -o | grep "123456"
WebComer
84

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

am0wa
sumber
Mengapa netstat tidak keluar kecuali Anda memberinya bendera n?
Pantai Jared
2
@JaredBeach - menunggu resolusi nama DNS terbalik, sehingga pada akhirnya akan selesai setelah batas waktu selesai. Jika ini tergantung pada IP internal , maka ini menunjukkan masalah dengan server DNS lokal Anda.
Steve Friedl
7

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 9999di 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.

eFox
sumber
4

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.

Quispie
sumber
4

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 forperintah 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

Pavankumar Barot
sumber
ada saran untuk memfilter PID unik karena perintah terkadang mengembalikan proses yang sama beberapa kali?
Krzysztof Krzeszewski
2

Ini membantu menemukan PID menggunakan nomor port.

lsof -i tcp:port_number
Mahaveer Jangir
sumber
1
Setelah mengetik perintah yang saya dapatkan'lsof' is not recognized as an internal or external command.
Srinivas
Bekerja di Linux.
Mahaveer Jangir
3
Pertanyaan ini tentang Windows
acaruci
0

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
ElMesa
sumber