Windows: Belirli bir bağlantı noktasında çalışan bir işlemi öldürmenin en hızlı yolu


11

Bu süreci birçok kez ele alıyorum. Bir Windows makinesinde bir işlemi öldürmem gerekiyor ve sadece portunu biliyorum. Normalde adımlar aşağıdaki gibidir: Portlara bakarak PID'yi bulun (örnek port 8084) Portlarda çalışan işlemleri listeleyin

netstat -a -o -n

Ve sonra bu bağlantı noktasındaki işlemi aşağıdaki komutla öldür

taskkill /F /PID <pid>

Bu komutu bir satırda çalıştırmak için Windows işletim sisteminde kullanabileceğim bir boru veya benzeri bir şey var mı?


1
Şu anda tam bir cevap yazamadığım için üzgünüm, ancak findstr(Windows grep) ' a bir göz atalım . Örneğin: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Belki bu size bir adım daha yaklaşır;)
Der Hochstapler

@OliverSalzburg Bu 2'ye dikkat etmeniz gerekir findstr: yerel veya uzak bağlantı noktası numarasıyla eşleşebilir. (Q'nun hangisini belirtmediğini kabul etmek.)
Richard

Yanıtlar:


10

Bu komutu tek bir satırda çalıştırmak için Windows işletim sisteminde kullanabileceğim bir boru veya benzeri bir şey var mı?

Hem cmd.exePowerShell hem de komutları bir komuttan diğerine destekler. PowerShell'de şöyle bir şey (bu komut satırında tek bir satırda olmalı veya bir komut dosyasında yeni satırlardan kaçmak için `kullanmalıdır):

netstat -ano
 | select -skip 4 
 | % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}} 
 | ? {$_.Fields[1] -match '15120$'}
 | % {taskkill /F /PID $_.Fields[4] }

Nerede:

  • Select -skip 4ilk dört başlık satırını atlar. ( nesnelerin projeleri gibi SQL SELECT gerçekleştirmek Selectiçin kısadır Select-Object.
  • %kısaltması , boru hattındaki Foreach-Objecther nesne ( $_) üzerinde bir komut dosyası bloğu gerçekleştirir ve komut dosyası bloğunun sonuçlarını boru hattına verir. Burada ilk önce girdiyi bir alan dizisine bölerek Originaldize netstatve Fieldsyeni oluşturulan dizinin iki özelliği olan yeni bir nesne oluşturur.
  • ?Where-Objectkomut dosyası bloğunun sonucuna göre hangi filtrelerin kısa olduğu. Burada, ikinci alanın sonunda bir normal ifadeyle eşleşiyor (tüm PowerShell kapsayıcıları sıfır tabanlı).

(Son eleman hariç hepsi test edildi: Öldürme işlemlerine başlamak istemiyorum :-)).

Uygulamada bunu basitleştireceğim, örneğin. yalnızca 0 veya ilkinden PID döndürerek foreach(başlıkları yoksaymak üzere tasarlanır) ve aramadan önce sıfır değerine filtre uygular taskkill. Bu yazmak daha hızlı olur, ancak PowerShell'i bilmeden takip edilmesi daha zordur.


Nedense benim powershell seçimi tanımıyor! Windows 7 çalıştırılıyor "Der Befehl" select "ist entweder falsch geschrieben oder konnte nicht gefunden werden." "Select-Object" için aynı
Armand

Bu benim için çalıştı, ancak işlem iki kez bulundu, IPv4 ve IPv6 sürümlerinin listelendiği için inanıyorum netstat. Bu, (muhtemelen zararsız) bir hataya yol açar ERROR: The process "12345" not found..
Scott Weldon

Bence buradaki önemli paket taskkill /F /PID [PID]. Bununla, birisi PID'yi almanın bir yolu olduğu sürece görevleri manuel olarak öldürebilir.
Sawtaytoes

1

Komut istemini açın ve çalıştırın:

for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a

Bir .bat bunu yapmak istiyorsanız, yerine % a için %% bir .

Sadece o portu dinleyen birini öldürmek istiyorsanız, diğer bulgunun sonuna ekleyin (^ | find "LISTENING").


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.