Windows'ta bir bağlantı noktası kullanan bir işlemin PID'sini bulun


Yanıtlar:


217

Bir komut kabuğu açın ve şunu yazın (bağlantı noktanız 123456 olsun):

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

İhtiyacın olan her şeyi göreceksin.

Başlıklar:

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

burada tüm ayrıntıları döndürdüğü için yalnızca pid'i nasıl alırım
Gobi M

sonuçların üzerindeki tek PID formu nasıl alınır
Chinya

11
veya,nestat -aon | findstr 123456
ROMANIA_engineer

Windows'ta bunu başarmanın kolay yolu bu soruda gösteriliyor - stackoverflow.com/questions/48198/…
Dracontis

4
windows / cygwin için, muhtemelen netstat -a -n -o olacaktır | grep "123456"
WebComer

84

Windows'ta bir bağlantı noktası kullanan bir işlemin PID'sini bulun (örneğin bağlantı noktası: "9999")

netstat -aon | find "9999"

-a Tüm bağlantıları ve dinleme bağlantı noktalarını görüntüler.

-o Her bağlantıyla ilişkili sahip olan işlem kimliğini görüntüler.

-n Adresleri ve bağlantı noktası numaralarını sayısal biçimde görüntüler.

Çıktı:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Ardından işlemi PID ile sonlandırın

taskkill /F /PID 15776

/F - İşlem (ler) in zorla sonlandırılacağını belirtir.

Not: Bazı belirli işlemleri sonlandırmak için fazladan bir izne (yöneticiden çalıştırma) ihtiyacınız olabilir.


Siz n işaretini vermedikçe netstat neden çıkmıyor?
Jared Beach

2
@JaredBeach - ters DNS adı çözümlemesini bekliyor, bu nedenle zaman aşımları tamamlandıktan sonra sonunda bitecek. Bu, dahili IP'lerde asılı kalırsa , yerel DNS sunucularınızla ilgili bir sorun olduğunu gösterir.
Steve Friedl

7

Bunu programlı olarak yapmak istiyorsanız, size verilen seçeneklerden bazılarını bir PowerShell betiğinde aşağıdaki gibi kullanabilirsiniz:

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

Ancak; Ne kadar doğru olursanız, PID sonucunuzun o kadar kesin olacağının farkında olun. Bağlantı noktasının hangi ana bilgisayarda olması gerektiğini biliyorsanız, onu çok daraltabilirsiniz. netstat -aon | findstr "0.0.0.0:9999"yalnızca bir uygulamayı ve büyük olasılıkla doğru olanı döndürür. Yalnızca bağlantı noktası numarasını aramak, yalnızca 9999içinde bulunan işlemleri döndürmenize neden olabilir , örneğin:

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

En olası aday genellikle ilk olarak sonuçlanır, ancak işlem, komut dosyanızı çalıştırmadan önce sona erdiyse, bunun yerine PID 12331 ile sonuçlanabilir ve yanlış işlemi sonlandırabilirsiniz.


4

Biraz senaryo ile uğraştıktan sonra bu eyleme geldim. Bir .bat dosyasına kopyalayın ve kaydedin:

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

Ücretsiz olması gereken bağlantı noktası numarasındaki 'bul "3306"' yı değiştirin. Ardından dosyayı yönetici olarak çalıştırın. Bu bağlantı noktasında çalışan tüm işlemleri öldürecektir.


4

Komut:

netstat -aon | findstr 4723

Çıktı:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Şimdi forWindows'taki komutu kullanarak "10396" işlem kimliğini kesin .

Komut:

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

Çıktı:

10396

Değerin 4. sayısını kesmek istiyorsanız "DİNLEME" anlamına gelir, ardından Windows'ta komut verin.

Komut:

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

Çıktı:

DİNLEME


Komut bazen aynı işlemi birden çok kez döndürdüğü için benzersiz PID'yi filtrelemek için herhangi bir öneri var mı?
Krzysztof Krzeszewski


0

Kopyalama senaryolarını kolaylaştırmak için PowerShell (Çekirdek uyumlu) tek satırlı:

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

Çıktı:

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

Aynı kod, geliştirici dostu:

$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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.