Bir İşlemi .BAT'den Kullanmakta Olan Bağlantı Noktasına Bakarak Sonlandırın


128

Windows'ta 8080 numaralı bağlantı noktasını arayan ve kullandığı işlemi .BAT dosyası aracılığıyla sonlandırmaya ne deneyebilir?


Sizi orada yolun bir parçası olarak alabilirim ... komut isteminden 'netstat -a -n -o' komutunu kullanın ve işlemlerin bir listesini ve hangi bağlantı noktalarında dinlediklerini (ayrıca ip ve başka bir IP'ye bağlılar ya da değiller ..) Paha biçilmez. Sonuçları hassaslaştırmak için neredeyse kesinlikle daha hoş anahtarlar olacaktır, ancak bunları elimden hatırlayamıyorum ... Umarım birileri bunun üzerine inşa edebilir?
Dave

Linux'ta yapabilirsiniz. cygwin'i kurarsanız, bat aswell'de yapabilirsiniz
Dani

@Dani, Mike: Cygwin büyük bir bağımlılıktır ve bu sorunu çözmek için gerekli değildir. Zaten sahipseniz, kullanın - linux komut satırı araçları çok daha iyidir.
Merlyn Morgan-Graham

Yanıtlar:


141

İşte başlamanıza yardımcı olacak bir komut:

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P

Toplu dosyanıza güvendiğinizde kaldırın @ECHO.

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P

Farklı işletim sistemleri için bunu biraz değiştirmeniz gerekebileceğini unutmayın. Örneğin, Windows 7'de tokens=5bunun yerine ihtiyacınız olabilir tokens=4.

Bu nasıl çalışır

FOR /F ... %variable IN ('command') DO otherCommand %variable...

Bu command, yürütmenizi ve çıktı üzerinde döngü oluşturmanızı sağlar . Her satır doldurulacak %variableve otherCommandistediğiniz kadar, istediğiniz yerde genişletilebilir . %variablegerçek kullanımda sadece tek harfli bir isim olabilir, örn %V.

"tokens=4 delims= "

Bu, her satırı beyaz boşluğa bölmenize ve bu satırdaki 4. parçayı alıp içine doldurmanıza %variable(bizim durumumuzda %%P) izin verir. delimsboş görünüyor, ancak bu fazladan alan aslında önemli.

netstat -a -n -o

Sadece çalıştırın ve öğrenin. Komut satırı yardımına göre, "Tüm bağlantıları ve dinleme bağlantı noktalarını görüntüler.", "Adresleri ve bağlantı noktası numaralarını sayısal biçimde görüntüler." Ve "Her bağlantıyla ilişkili sahip olma işlem kimliğini görüntüler." Bu seçenekleri başka biri önerdiği için kullandım ve işe yaradı :)

^|

Bu, ilk komutun veya programın ( netstat) çıktısını alır ve bunu ikinci bir komut programına ( findstr) iletir . Eğer yerine bir komut dizesi içinde komut satırında doğrudan bu kullandıysanız, kullanırsınız |yerine ^|.

findstr :8080

Bu, kendisine iletilen tüm çıktıları filtreler ve yalnızca içeren satırları döndürür :8080.

TaskKill.exe /PID <value>

Bu, işlem kimliğini kullanarak çalışan bir görevi sonlandırır.

%%P instead of %P

Bu, toplu iş dosyalarında gereklidir. Bunu komut isteminde yaptıysanız, %Ponun yerine kullanırsınız.


Sen vs jeton, delims, kontrol ile oynamak gerekebilir HELP FORdiğer bir çok seçenek görmek için komut satırında FORverecek ve kontrol netstat -?, findstr /?ve TaskKill /?hatta daha fazla yardım için.
Merlyn Morgan-Graham

Deneyeceğim ve sana geri döneceğim.
Mike Flynn

6
FOR / F "belirteç = 5 delims =" %% P IN ('netstat -a -n -o ^ | findstr: 8080') DO TaskKill.exe / F / PID %% P
Mike Flynn

10
Bu harika. tokens=4Sanırım Windows XP ve tokens=5Windows 7. Ayrıca /Földürmeye zorlamak iyi bir fikir .
Strelok

1
@ MerlynMorgan-Graham, bu kabul edilen bir cevap olduğundan, lütfen stackoverflow.com/a/20637662/5243762'den bu yanıta da puan eklemeyi düşünün
IAmSurajBobade

196

Komut istemini açın ve aşağıdaki komutları çalıştırın

 C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000      0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116

burada 3116 işlem kimliği


evet, bu her yerde farklı olacak
Mohit Singh

3
çok kullanışlı ! Unutmayın, 0.0: 3000 yerine 3000 aradım çünkü 0.0.0.0 yerine 127.0.01
Leeeeeeelo

2
Teşekkürler, kontrolden çıkmış bir webpack dev görevini öldüren harika iş :)
danjah

Veya basitçe netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Burada 9797 bağlantı noktası numarasıdır, iI bu komutu sık sık hatalı çalışan / asılı sunucuyu öldürmek için kullanıyorum.
Mohit Singh

53

Komut satırında belirli bir işlemi bulmak için aşağıdaki komutu kullanın: 8080, işlem tarafından kullanılan bağlantı noktasıdır

netstat -ano | findstr 8080

işlemi öldürmek için aşağıdaki komutu kullanın 21424 işlem kimliğidir

taskkill /pid 21424 /F 

@EralpB Keyfini Çıkar :)
Girdhar Singh Rathore

19

Merlyn'in çözümünü kullanmak, diğer uygulamaların Firefox gibi öldürülmesine neden oldu. Bu işlemler aynı bağlantı noktasını kullanıyordu, ancak dinleyici olarak kullanılmıyordu:

Örneğin:

netstat -a -n -o | findstr :8085
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       6568
  TCP    127.0.0.1:49616        127.0.0.1:8085         TIME_WAIT       0
  TCP    127.0.0.1:49618        127.0.0.1:8085         TIME_WAIT       0

Bu nedenle, aşağıdaki gibi findstr'e "LISTENING" ekleyerek bunları hariç tutabilirsiniz:

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

18

8080 numaralı bağlantı noktasında çalışan tüm işlemleri listelemek için aşağıdakileri yapın.

netstat -ano | "8080" bul

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

TCP    [::]:8080              [::]:0                 LISTENING       10612

Ardından işlemi sonlandırmak için aşağıdaki komutu çalıştırın

taskkill / F / PID 10612


13

Hepinize teşekkür ederim, sadece / F kuvvet anahtarı TaskKill ile birlikte gönderilmedikçe bazı işlemlerin kapanmayacağını eklemek için. Ayrıca / T anahtarı ile, sürecin tüm ikincil konuları kapatılacaktır.

C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^|
 findstr :2002') DO TaskKill.exe /PID %P /T /F

Hizmetler için, hizmetin adını almak ve yürütmek gerekecektir:

sc stop ServiceName


2

Sadece tamamlanması için:

Belirli bir bağlantı noktasına bağlı tüm süreçleri öldürmek istedim ama dinleyen süreci değil

9001 bağlantı noktası için komut (cmd kabuğunda):

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

findstr :

  • r ifadeler içindir ve c tam olarak eşleşecek zincir içindir.
  • [] * eşleşen boşluklar içindir

netstat :

  • a -> tümü
  • n -> çözme (daha hızlı)
  • o -> pid

Netstat kaynak bağlantı noktasını, ardından hedef bağlantı noktasını ve ardından KURULDUĞU yazdırdığı için çalışır.


2

Aşağıdaki içeriğe sahip bir yarasa dosyası oluşturuldu, bağlantı noktası numarası için girişi kabul eder

@ECHO ON
set /p portid=Enter the Port to be killed: 
echo %portid%                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

Son olarak çıkmak için "Enter" a tıklayın.


@TusharPandey Bu, Windows etiketli bir sorudur, bu nedenle bir kabuk komut dosyası değil, bir Windows komut dosyasıdır
Sireesh Yarlagadda

1

8080 numaralı bağlantı noktasında dinleyen işlemi sonlandırmak istiyorsanız, PowerShell'i kullanabilirsiniz. Sadece Get-NetTCPConnectioncmdlet'i Stop-Process.

Windows 10 veya Windows Server 2016'da PowerShell 5 ile test edilmiştir ve çalışmalıdır. Ancak, PowerShell 5'in yüklü olduğu eski Windows sürümlerinde de çalışması gerektiğini tahmin ediyorum.

İşte bir örnek:

PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

0

Merlyn'in cevabına benzer, ancak bu, şu durumları da ele alıyor:

  • Bağlantı noktası numarası aslında aramadığınız başka bir daha uzun bağlantı noktası numarasının sol alt dizesidir. Rastgele, masum bir işlemi öldürmemek için kesin bir port numarası aramak istiyorsunuz !
  • Komut dosyası kodunun birden fazla kez çalışabilmesi ve her seferinde doğru olması, daha eski, yanlış yanıtlar göstermemesi gerekir.

İşte burada:

set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
  taskkill /PID %serverPid%
) else (
  rem echo Server is not running.
)

0

Adımlar:

  1. Apache tomcat sunucunuzun confklasörüne gidin . Benim durumumda, apache-tomcat-7.0.61 kullandığım gibiapache-tomcat-7.0.61\conf

  2. Açın server.xmlve 8080 olan bağlantı noktası numarasını dilediğiniz gibi başka bir bağlantı noktasına değiştirin. Örneğin: 8081,8082,8087 vb.

  3. Şimdi binklasöre gidin ve çalıştırınshutdown.bat

  4. Şimdi sunucuyu tutulma ile yeniden başlatın.

Artık projeniz kesintisiz çalışacak.


0

Bir Powershell Komut Dosyası arayan biri varsa:

function Search-And-Destroy
{
    param ( [Parameter(Mandatory=$true)][string]$port )
    $lines = netstat -a -o -n | findstr $port
    $ports = @()

    ForEach($line In $lines)
    {
        $res = $($lines -split '\s+')
        $ports += $res[5]
    }

    $ports = $ports | select -uniq

    ForEach($port In $ports)
    {
        echo $(taskkill /F /PID $port)
    }
}

Bu işlev temelde yukarıdaki işlevlerin yaptığı şeyi yapar, ancak Powershell komut dosyası biçimindedir, böylece onu Powershell profilinize ekleyebilirsiniz. Profilinizin konumunu bulmak için powershell'e gidin ve yazınecho $profile


1
Bu gerçekten bir PowerShell betiği değil, netstataracı etrafında PowerShell tabanlı bir sarmalayıcıdır .
bahrep

0

Bunu komut satırına yapıştırın

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)

%%PBunun yerine toplu pu'da kullanmak istiyorsanız%P


Bu, işletim sisteminin diline bağlıdır, tüm dillerde çalışmasını sağlamak için herhangi bir yol var mı?
Jakob

@Jakob Bu yalnızca Windows'ta cmd terminalinde, ayrıca yalnızca .cmd veya .bat dosyalarında çalıştırılabilir
Eduard Florinescu

Evet, ancak yalnızca İngilizce dilinde, aksi takdirde "DİNLEME" işletim sisteminin diline çevrilecektir.
Jakob

@Jakob netstatAracın diğer dillere çevrildiğinin farkında değilim
Eduard Florinescu

0

sisteme göre görevi bitiremezsiniz. bu komutu dene

x:> net durak http / y


3
"Eğer sisteme göre" ne anlama geliyor? Ve bu cevap nasıl diğerlerinden daha iyi?
Nico Haase
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.