Giết một tiến trình bằng cách tra cứu cổng đang được sử dụng từ .BAT


128

Trong Windows, cái gì có thể tìm cổng 8080 và cố gắng giết quá trình nó đang sử dụng thông qua tệp .BAT?


Tôi có thể giúp bạn một phần trong đó ... từ dấu nhắc lệnh sử dụng lệnh 'netstat -a -n -o' và bạn sẽ thấy một danh sách các quy trình và cổng nào họ đang nghe (cũng như ip và liệu chúng có được kết nối với IP khác hay không ..) Vô giá. Gần như chắc chắn sẽ có những công tắc đẹp hơn để tinh chỉnh kết quả, nhưng tôi không thể nhớ chúng ra tay ... Hy vọng ai đó có thể xây dựng dựa trên điều này?
Dave

Trong linux bạn có thể. nếu bạn cài đặt cygwin, bạn sẽ có thể vào bat aswell
Dani

@Dani, Mike: Cygwin là một người phụ thuộc rất lớn và không bắt buộc phải giải quyết vấn đề này. Tuy nhiên, nếu bạn đã có nó, hãy sử dụng nó - các công cụ dòng lệnh linux sẽ tốt hơn nhiều.
Merlyn Morgan-Graham

Câu trả lời:


141

Đây là một lệnh để giúp bạn bắt đầu:

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

Khi bạn tự tin vào tệp bó của mình, hãy xóa @ECHO.

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

Lưu ý rằng bạn có thể cần thay đổi điều này một chút cho các hệ điều hành khác nhau. Ví dụ, trên Windows 7 bạn có thể cần tokens=5thay vì tokens=4.

Làm thế nào điều này hoạt động

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

Điều này cho phép bạn thực thi commandvà lặp qua đầu ra của nó. Mỗi dòng sẽ được nhồi vào %variable, và có thể được mở rộng ra otherCommandbao nhiêu lần tùy thích, bất cứ nơi nào bạn muốn. %variabletrong sử dụng thực tế chỉ có thể có một tên đơn, ví dụ %V.

"tokens=4 delims= "

Điều này cho phép bạn tách từng dòng theo khoảng trắng và lấy đoạn thứ 4 trong dòng đó và nhét nó vào %variable(trong trường hợp của chúng tôi, %%P). delimstrông trống rỗng, nhưng không gian thêm đó thực sự quan trọng.

netstat -a -n -o

Chỉ cần chạy nó và tìm hiểu. Theo trợ giúp về dòng lệnh, nó "Hiển thị tất cả các kết nối và cổng nghe.", "Hiển thị địa chỉ và số cổng ở dạng số." Và "Hiển thị ID tiến trình sở hữu được liên kết với mỗi kết nối.". Tôi chỉ sử dụng các tùy chọn này vì người khác đề xuất và nó đã hoạt động :)

^|

Cái này lấy đầu ra của lệnh hoặc chương trình đầu tiên ( netstat) và chuyển nó vào chương trình lệnh thứ hai ( findstr). Nếu bạn đang sử dụng điều này trực tiếp trên dòng lệnh, thay vì bên trong chuỗi lệnh, bạn sẽ sử dụng |thay vì ^|.

findstr :8080

Cái này lọc bất kỳ đầu ra nào được truyền vào nó, chỉ trả về các dòng có chứa :8080.

TaskKill.exe /PID <value>

Điều này giết chết một tác vụ đang chạy, sử dụng ID tiến trình.

%%P instead of %P

Điều này là bắt buộc trong các tập tin hàng loạt. Nếu bạn đã làm điều này trên dấu nhắc lệnh, bạn sẽ sử dụng %Pthay thế.


Bạn có thể cần phải chơi với thẻ, delims, vv Kiểm tra HELP FORtrên dòng lệnh để xem rất nhiều lựa chọn khác mà FORsẽ cung cấp cho bạn, và kiểm tra netstat -?, findstr /?TaskKill /?để được giúp đỡ nhiều hơn.
Merlyn Morgan-Graham

Tôi sẽ thử nó và lấy lại cho bạn.
Mike Flynn

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

10
Điều đó thật tuyệt. tokens=4Tôi nghĩ là Windows XP và tokens=5Windows 7. Cũng là một ý tưởng hay để /Fbuộc giết.
Strelok

1
@ MerlynMorgan-Graham vì đây là câu trả lời được chấp nhận, vui lòng xem xét thêm điểm từ stackoverflow.com/a/20637662/5243762 câu trả lời này
IAmSurajBobade

196

Mở dấu nhắc lệnh và chạy các lệnh sau

 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

, ở đây, 3116 là ID tiến trình


vâng, nó sẽ khác nhau ở mọi nơi
Mohit Singh

3
rất hữu ích ! Hãy nhớ rằng tôi tìm kiếm: 3000 thay vì 0,0: 3000 vì nó có thể dưới 127.0,01 thay vì
0,0.0.0

2
Cảm ơn bạn, công việc tuyệt vời giết chết một nhiệm vụ phát triển webpack mất kiểm soát :)
danjah

Hoặc bạn có thể chỉ cần cung cấp netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Ở đây 9797 là số cổng, tôi thường xuyên sử dụng lệnh này để tiêu diệt máy chủ bị treo / treo.
Mohit Singh

53

Để tìm quy trình cụ thể trên dòng lệnh, sử dụng lệnh dưới đây, 8080 là cổng được sử dụng bởi process

netstat -ano | findstr 8080

để giết quá trình sử dụng lệnh dưới đây, 21424 là process id

taskkill /pid 21424 /F 

@EralpB Thưởng thức :)
Girdhar Singh Rathore

19

Sử dụng giải pháp của Merlyn khiến các ứng dụng khác bị giết như firefox. Các quy trình này đã sử dụng cùng một cổng, nhưng không phải là người nghe:

ví dụ:

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

Do đó, có thể loại trừ những điều này bằng cách thêm "LISTENING" vào findstr như sau:

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

18

Để liệt kê tất cả quá trình chạy trên cổng 8080, hãy làm như sau.

netstat -ano | tìm "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

Sau đó, để giết quá trình chạy lệnh sau

tác vụ / F / PID 10612


13

Cảm ơn tất cả các bạn, chỉ cần thêm rằng một số quy trình sẽ không đóng trừ khi công tắc lực / F cũng được gửi với TaskKill. Ngoài ra với công tắc / T, tất cả các luồng thứ cấp của quá trình sẽ được đóng lại.

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

Đối với các dịch vụ, cần phải lấy tên của dịch vụ và thực thi:

sc dừng dịch vụ


2

Chỉ cần hoàn thành:

Tôi muốn giết tất cả các quy trình được kết nối với một cổng cụ thể nhưng không phải là quá trình lắng nghe

lệnh (trong cmd shell) cho port 9001 là:

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

tìm kiếm :

  • r là cho biểu thức và c cho chuỗi chính xác để khớp.
  • [] * Dành cho không gian phù hợp

netstat :

  • một -> tất cả
  • n -> không giải quyết (nhanh hơn)
  • o -> pid

Nó hoạt động vì netstat in ra cổng nguồn rồi đến cổng đích và sau đó THÀNH LẬP


2

Tạo một tập tin bat với nội dung dưới đây, nó chấp nhận đầu vào cho số cổng

@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

Cuối cùng bấm vào "Enter" để thoát.


@TusharPandey Đây là câu hỏi được gắn thẻ windows, vì vậy đây là tập lệnh windows chứ không phải tập lệnh shell
Sireesh Yarlagadda

1

Nếu bạn muốn giết quá trình nghe trên cổng 8080, bạn có thể sử dụng PowerShell. Chỉ cần kết hợp Get-NetTCPConnectioncmdlet với Stop-Process.

Đã thử nghiệm và sẽ hoạt động với PowerShell 5 trên Windows 10 hoặc Windows Server 2016. Tuy nhiên, tôi đoán rằng nó cũng sẽ hoạt động trên các phiên bản Windows cũ hơn đã cài đặt PowerShell 5.

Đây là một ví dụ:

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

Tương tự như phản ứng của Merlyn, nhưng điều này cũng xử lý những trường hợp này:

  • Số cổng thực sự là một chuỗi con bên trái của một số cổng dài hơn mà bạn không tìm kiếm. Bạn muốn tìm kiếm một số cổng chính xác để không giết chết một quá trình ngẫu nhiên, vô tội!
  • Mã tập lệnh cần có khả năng chạy nhiều lần và chính xác mỗi lần, không hiển thị các câu trả lời cũ hơn, không chính xác.

Đây là:

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

Các bước:

  1. Chuyển đến confthư mục của máy chủ tomcat apache của bạn . Trong trường hợp của tôi, apache-tomcat-7.0.61\confgiống như tôi đang sử dụng apache-tomcat-7.0.61

  2. Mở server.xmlvà thay đổi số cổng từ 8080 sang bất kỳ cổng nào khác theo ý muốn của bạn. Ví dụ: 8081,8082,8087, v.v.

  3. Bây giờ hãy vào binthư mục và chạyshutdown.bat

  4. Bây giờ khởi động lại máy chủ thông qua nhật thực.

Bây giờ dự án của bạn sẽ làm việc mà không có bất kỳ gián đoạn.


0

Nếu bất cứ ai đang tìm kiếm một Powershell Script:

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

Hàm này về cơ bản thực hiện những gì các hàm trên làm, nhưng nó ở định dạng kịch bản lệnh Powershell để bạn có thể thêm nó vào hồ sơ Powershell của mình. Để tìm vị trí hồ sơ của bạn, hãy truy cập powershell và gõecho $profile


1
Đây thực sự không phải là tập lệnh PowerShell, mà là trình bao bọc dựa trên PowerShell xung quanh netstatcông cụ.
bahrep

0

Dán cái này vào dòng lệnh

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

Nếu bạn muốn sử dụng nó trong một đợt pu %%Pthay vì%P


Điều này phụ thuộc vào ngôn ngữ của HĐH, có cách nào để làm cho nó hoạt động cho tất cả các ngôn ngữ không?
Jakob

@Jakob Điều này chỉ có thể được chạy trong thiết bị đầu cuối cmd trong Windows, cũng chỉ trong các tệp .cmd hoặc .bat
Eduard Florinescu

Có, nhưng chỉ bằng ngôn ngữ tiếng Anh, vì nếu không thì "LISTENING" sẽ được dịch sang ngôn ngữ của HĐH.
Jakob

@Jakob Tôi không biết rằng netstatcông cụ này được dịch sang các ngôn ngữ khác
Eduard Florinescu

0

nếu bạn theo hệ thống, bạn không thể kết thúc nhiệm vụ đó. thử lệnh này

x:> net dừng http / y


3
"Nếu bạn theo hệ thống" nghĩa là gì? Và làm thế nào là câu trả lời này tốt hơn tất cả những người khác?
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.