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?
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?
Câu trả lời:
Đâ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=5
thay 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 command
và 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 otherCommand
bao nhiêu lần tùy thích, bất cứ nơi nào bạn muốn. %variable
trong 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
). delims
trô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 %P
thay thế.
HELP FOR
trên dòng lệnh để xem rất nhiều lựa chọn khác mà FOR
sẽ cung cấp cho bạn, và kiểm tra netstat -?
, findstr /?
và TaskKill /?
để được giúp đỡ nhiều hơn.
tokens=4
Tôi nghĩ là Windows XP và tokens=5
Windows 7. Cũng là một ý tưởng hay để /F
buộc giết.
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
Để 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
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
Để 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
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ụ
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 :
netstat :
Nó hoạt động vì netstat in ra cổng nguồn rồi đến cổng đích và sau đó THÀNH LẬP
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.
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-NetTCPConnection
cmdlet 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"):
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:
Đâ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.
)
Các bước:
Chuyển đến conf
thư 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\conf
giống như tôi đang sử dụng apache-tomcat-7.0.61
Mở server.xml
và 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.
Bây giờ hãy vào bin
thư mục và chạyshutdown.bat
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.
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
netstat
công cụ.
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 %%P
thay vì%P
netstat
công cụ này được dịch sang các ngôn ngữ khác
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