Bunuh Proses dengan Mencari Port yang digunakan dari .BAT

128

Di Windows apa yang bisa mencari port 8080 dan mencoba mematikan proses yang digunakannya melalui file .BAT?

Mike Flynn
sumber
Saya dapat membuat Anda menjadi bagian dari perjalanan ke sana ... dari command prompt gunakan perintah 'netstat -a -n -o' dan Anda akan melihat daftar proses dan port mana yang mereka dengarkan (serta ip dan apakah mereka terhubung ke IP lain atau tidak ..) Berharga. Hampir pasti akan ada saklar yang lebih baik untuk menyaring hasilnya, tapi saya tidak dapat mengingatnya begitu saja ... Semoga seseorang dapat membangun ini?
Dave
Di linux Anda bisa. jika Anda menginstal cygwin, Anda juga bisa menggunakannya
Dani
@Dani, Mike: Cygwin adalah ketergantungan besar dan tidak diharuskan untuk menyelesaikan masalah ini. Jika Anda sudah mendapatkannya, gunakan itu - alat baris perintah linux jauh lebih baik.
Merlyn Morgan-Graham

Jawaban:

141

Inilah perintah untuk memulai:

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

Saat Anda yakin dengan file batch Anda, hapus @ECHO.

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

Perhatikan bahwa Anda mungkin perlu mengubahnya sedikit untuk OS yang berbeda. Sebagai contoh, pada Windows 7 Anda mungkin perlu tokens=5bukan tokens=4.

Bagaimana ini bekerja?

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

Ini memungkinkan Anda mengeksekusi command, dan mengulang outputnya. Setiap baris akan dimasukkan ke dalam %variable, dan dapat diperluas otherCommandsebanyak yang Anda suka, di mana pun Anda suka. %variabledalam penggunaan aktual hanya dapat memiliki nama satu huruf, mis %V.

"tokens=4 delims= "

Ini memungkinkan Anda membagi setiap baris dengan spasi putih, dan mengambil potongan ke-4 di baris itu, dan memasukkannya ke dalam %variable(dalam kasus kami, %%P). delimsterlihat kosong, tetapi ruang ekstra itu sebenarnya signifikan.

netstat -a -n -o

Jalankan saja dan cari tahu. Menurut bantuan baris perintah, ini "Menampilkan semua koneksi dan mendengarkan port.", "Menampilkan alamat dan nomor port dalam bentuk numerik.", Dan "Menampilkan ID proses kepemilikan yang terkait dengan setiap koneksi.". Saya hanya menggunakan opsi ini karena orang lain menyarankannya, dan ternyata berhasil :)

^|

Ini mengambil output dari perintah atau program pertama ( netstat) dan meneruskannya ke program perintah kedua ( findstr). Jika Anda menggunakan ini secara langsung pada baris perintah, bukannya di dalam string perintah, Anda akan menggunakan |bukan ^|.

findstr :8080

Ini menyaring semua output yang dilewatkan ke dalamnya, hanya mengembalikan garis yang berisi :8080.

TaskKill.exe /PID <value>

Ini membunuh tugas yang sedang berjalan, menggunakan ID proses.

%%P instead of %P

Ini diperlukan dalam file batch. Jika Anda melakukan ini pada command prompt, Anda akan menggunakannya %Psebagai gantinya.

Merlyn Morgan-Graham
sumber
Anda mungkin perlu untuk bermain dengan token, delims, dll Periksa HELP FORpada baris perintah untuk melihat banyak pilihan lain yang FORakan memberi Anda, dan periksa netstat -?, findstr /?dan TaskKill /?bantuan bahkan lebih.
Merlyn Morgan-Graham
Saya akan mencobanya dan kembali kepada Anda.
Mike Flynn
6
UNTUK / F "token = 5 delims =" %% P IN ('netstat -a -n -o ^ | findstr: 8080') LAKUKAN TaskKill.exe / F / PID %% P
Mike Flynn
10
Ini bagus. tokens=4adalah Windows XP yang saya pikir dan tokens=5Windows 7. Juga ide yang bagus untuk /Fmemaksa pembunuhan.
Strelok
1
@ MerlynMorgan-Graham karena ini adalah jawaban yang diterima, harap pertimbangkan untuk menambahkan poin dari stackoverflow.com/a/20637662/5243762 jawaban ini juga
IAmSurajBobade
196

Buka command prompt dan jalankan perintah berikut

 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

, di sini 3116 adalah ID proses

Mohit Singh
sumber
ya itu akan berbeda di mana
Mohit Singh
3
sangat berguna ! Pikiran Anda, saya mencari: 3000 bukannya 0.0: 3000 karena itu bisa di bawah 127.0.01 bukannya 0.0.0.0
Leeeeeeelo
2
Terima kasih, kerja bagus membunuh tugas dev webpack yang tidak terkontrol :)
danjah
Atau Anda cukup memberikan netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Di sini 9797 adalah nomor port, iI sering menggunakan perintah ini untuk membunuh server yang rusak / digantung.
Mohit Singh
53

Untuk menemukan proses spesifik pada baris perintah, gunakan perintah di bawah ini di sini 8080 adalah port yang digunakan oleh proses

netstat -ano | findstr 8080

untuk mematikan proses, gunakan perintah di bawah ini di sini 21424 adalah proses id

taskkill /pid 21424 /F 
Girdhar Singh Rathore
sumber
@EralpB Nikmati :)
Girdhar Singh Rathore
19

Menggunakan solusi Merlyn menyebabkan aplikasi lain terbunuh seperti firefox. Proses-proses ini menggunakan port yang sama, tetapi tidak sebagai pendengar:

misalnya:

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

Oleh karena itu, dapat mengecualikan ini dengan menambahkan "MENDENGARKAN" ke findstr sebagai berikut:

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

Untuk membuat daftar semua proses yang berjalan pada port 8080 lakukan hal berikut.

netstat -ano | temukan "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

Kemudian untuk membunuh proses jalankan perintah berikut

taskkill / F / PID 10612

Sardesh Sharma
sumber
13

Terima kasih semua, hanya untuk menambahkan bahwa beberapa proses tidak akan ditutup kecuali jika / F force switch juga dikirim dengan TaskKill. Juga dengan / T switch, semua utas sekunder dari proses akan ditutup.

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

Untuk layanan, Anda perlu mendapatkan nama layanan dan menjalankan:

sc menghentikan ServiceName

xtrm
sumber
2

Hanya untuk penyelesaian:

Saya ingin membunuh semua proses yang terhubung ke port tertentu tetapi tidak mendengarkan proses

perintah (dalam cmd shell) untuk port 9001 adalah:

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

findstr :

  • r adalah untuk ekspresi dan c untuk rantai yang tepat untuk dicocokkan.
  • [] * untuk spasi yang cocok

netstat :

  • a -> semua
  • n -> jangan menyelesaikan (lebih cepat)
  • o -> pid

Ini bekerja karena netstat mencetak port sumber kemudian port tujuan dan kemudian DIDIRIKAN

Boop
sumber
2

Membuat file kelelawar dengan konten di bawah ini, ia menerima input untuk nomor port

@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

Terakhir klik "Enter" untuk keluar.

Sireesh Yarlagadda
sumber
@TusharPandey Ini adalah pertanyaan yang ditandai windows, jadi ini adalah skrip windows, bukan skrip shell
Sireesh Yarlagadda
1

Jika Anda ingin mematikan proses yang mendengarkan pada port 8080, Anda bisa menggunakan PowerShell. Cukup gabungkan Get-NetTCPConnectioncmdlet dengan Stop-Process.

Diuji dan harus bekerja dengan PowerShell 5 pada Windows 10 atau Windows Server 2016. Namun, saya rasa itu juga harus bekerja pada versi Windows yang lebih lama yang memiliki PowerShell 5 diinstal.

Berikut ini sebuah contoh:

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"):
bahrep
sumber
0

Mirip dengan respons Merlyn, tetapi yang ini menangani kasus-kasus ini juga:

  • Nomor port sebenarnya adalah substring kiri dari nomor port lagi yang tidak Anda cari. Anda ingin mencari nomor port yang tepat sehingga Anda tidak membunuh proses acak dan tidak bersalah!
  • Kode skrip harus dapat berjalan lebih dari sekali dan benar setiap kali, tidak menunjukkan jawaban yang lebih tua, salah.

Ini dia:

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.
)
Yavin5
sumber
0

Langkah:

  1. Buka conffolder server tomcat apache Anda . Dalam kasus saya, apache-tomcat-7.0.61\confsaya menggunakan apache-tomcat-7.0.61

  2. Buka server.xmldan ubah nomor port dari 8080 ke port lain sesuai keinginan. Sebagai contoh: 8081.8082.8087 dll

  3. Sekarang buka binfolder dan jalankanshutdown.bat

  4. Sekarang restart server melalui gerhana.

Sekarang proyek Anda akan bekerja tanpa gangguan.

Vineetha Swathi
sumber
0

Jika ada yang mencari Skrip Powershell:

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)
    }
}

Fungsi ini pada dasarnya melakukan apa yang dilakukan fungsi-fungsi di atas, tetapi dalam format skrip Powershell sehingga Anda dapat menambahkannya ke profil Powershell Anda. Untuk menemukan lokasi profil Anda, buka PowerShell dan ketikecho $profile

watzon
sumber
1
Ini sebenarnya bukan skrip PowerShell, melainkan pembungkus berbasis PowerShell di sekitar netstatalat.
bahrep
0

Rekatkan ini ke baris perintah

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

Jika Anda ingin menggunakannya dalam batch pu, %%Pbukan%P

Eduard Florinescu
sumber
Ini tergantung pada bahasa OS, apakah ada cara untuk membuatnya bekerja untuk semua bahasa?
Jakob
@Jakob Ini hanya dapat dijalankan di terminal cmd di Windows, juga hanya dalam file .cmd atau .bat
Eduard Florinescu
Ya, tetapi hanya dalam bahasa Inggris, karena jika tidak, "MENDENGARKAN" akan diterjemahkan ke bahasa OS.
Jakob
@ Jakob Saya tidak menyadari bahwa netstatalat ini diterjemahkan ke bahasa lain
Eduard Florinescu
0

jika Anda dengan sistem Anda tidak dapat mengakhiri tugas itu. coba perintah ini

x:> net stop http / y

Nrawut Phrommahit
sumber
3
Apa artinya "jika Anda menggunakan sistem"? Dan bagaimana jawaban ini lebih baik daripada yang lainnya?
Nico Haase