ใน Windows มีอะไรบ้างที่สามารถมองหาพอร์ต 8080 และพยายามฆ่ากระบวนการที่ใช้ผ่านไฟล์. BAT
ใน Windows มีอะไรบ้างที่สามารถมองหาพอร์ต 8080 และพยายามฆ่ากระบวนการที่ใช้ผ่านไฟล์. BAT
คำตอบ:
นี่คือคำสั่งในการเริ่มต้น:
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P
เมื่อคุณมั่นใจในไฟล์แบตช์ของคุณแล้วให้ลบ@ECHO
.
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P
โปรดทราบว่าคุณอาจต้องเปลี่ยนแปลงเล็กน้อยสำหรับระบบปฏิบัติการอื่น ยกตัวอย่างเช่นใน Windows 7 คุณอาจต้องแทนtokens=5
tokens=4
วิธีการทำงาน
FOR /F ... %variable IN ('command') DO otherCommand %variable...
สิ่งนี้ช่วยให้คุณดำเนินการcommand
และวนซ้ำบนเอาต์พุต แต่ละบรรทัดจะถูกยัดเข้าไป%variable
และสามารถขยายออกได้otherCommand
หลายครั้งเท่าที่คุณต้องการทุกที่ที่คุณต้องการ ในการใช้งานจริงเท่านั้นที่สามารถมีชื่อตัวอักษรเดียวเช่น%variable
%V
"tokens=4 delims= "
วิธีนี้ช่วยให้คุณแบ่งแต่ละบรรทัดด้วยช่องว่างและนำส่วนที่ 4 ในบรรทัดนั้นมารวมกัน%variable
(ในกรณีของเรา%%P
) delims
ดูว่างเปล่า แต่พื้นที่ส่วนเกินนั้นมีความสำคัญมาก
netstat -a -n -o
เพียงแค่เรียกใช้และค้นหา ตามวิธีใช้บรรทัดคำสั่ง "แสดงการเชื่อมต่อและพอร์ตการรับฟังทั้งหมด", "แสดงที่อยู่และหมายเลขพอร์ตในรูปแบบตัวเลข" และ "แสดง ID กระบวนการเป็นเจ้าของที่เชื่อมโยงกับการเชื่อมต่อแต่ละครั้ง" ฉันเพิ่งใช้ตัวเลือกเหล่านี้เนื่องจากมีคนอื่นแนะนำและมันก็ใช้ได้ผล :)
^|
สิ่งนี้รับเอาต์พุตของคำสั่งแรกหรือโปรแกรม ( netstat
) และส่งผ่านไปยังโปรแกรมคำสั่งที่สอง ( findstr
) หากคุณใช้สิ่งนี้โดยตรงบนบรรทัดคำสั่งแทนที่จะใช้ภายในสตริงคำสั่งคุณจะใช้|
แทน^|
.
findstr :8080
ซึ่งจะกรองเอาท์พุทใด ๆ :8080
ที่จะผ่านเข้าสู่มันกลับมาเส้นเดียวที่มี
TaskKill.exe /PID <value>
สิ่งนี้ฆ่างานที่กำลังรันอยู่โดยใช้ ID กระบวนการ
%%P instead of %P
สิ่งนี้จำเป็นในไฟล์แบตช์ ถ้าคุณทำในพรอมต์คำสั่งคุณจะใช้%P
แทน
HELP FOR
ในบรรทัดคำสั่งที่จะเห็นจำนวนมากของตัวเลือกอื่น ๆ ที่FOR
จะช่วยให้คุณและตรวจสอบnetstat -?
, findstr /?
และTaskKill /?
สำหรับความช่วยเหลือมากยิ่งขึ้น
tokens=4
ฉันคิดว่า Windows XP และtokens=5
Windows 7 เป็นความคิดที่ดีที่จะ/F
บังคับให้ฆ่า
เปิดพรอมต์คำสั่งและรันคำสั่งต่อไปนี้
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
ที่นี่ 3116 คือรหัสกระบวนการ
หากต้องการค้นหากระบวนการเฉพาะในบรรทัดคำสั่งให้ใช้คำสั่งด้านล่างที่นี่ 8080 คือพอร์ตที่ใช้โดยกระบวนการ
netstat -ano | findstr 8080
เพื่อฆ่ากระบวนการใช้คำสั่งด้านล่างที่นี่ 21424 คือรหัสกระบวนการ
taskkill /pid 21424 /F
การใช้โซลูชันของ Merlyn ทำให้แอปพลิเคชันอื่น ๆ ถูกฆ่าเช่น firefox กระบวนการเหล่านี้ใช้พอร์ตเดียวกัน แต่ไม่ใช่ในฐานะผู้ฟัง:
เช่น:
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
ดังนั้นจึงสามารถยกเว้นสิ่งเหล่านี้ได้โดยเพิ่ม "LISTENING" ใน findstr ดังนี้:
FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P
หากต้องการแสดงรายการกระบวนการทั้งหมดที่ทำงานบนพอร์ต 8080 ให้ทำดังต่อไปนี้
netstat -ano | หา "8080"
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10612
TCP [::]:8080 [::]:0 LISTENING 10612
จากนั้นเพื่อฆ่ากระบวนการให้รันคำสั่งต่อไปนี้
งานสกิล / F / PID 10612
ขอบคุณทุกคนเพียงเพื่อเพิ่มว่ากระบวนการบางอย่างจะไม่ปิดเว้นแต่ว่าสวิตช์บังคับ / F จะถูกส่งด้วย TaskKill นอกจากนี้ด้วยสวิตช์ / T เธรดรองทั้งหมดของกระบวนการจะถูกปิด
C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :2002') DO TaskKill.exe /PID %P /T /F
สำหรับบริการจำเป็นต้องได้รับชื่อของบริการและดำเนินการ:
sc หยุด ServiceName
สร้างไฟล์ bat ที่มีเนื้อหาด้านล่างโดยจะรับอินพุตสำหรับหมายเลขพอร์ต
@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
สุดท้ายคลิก "Enter" เพื่อออก
เพียงเพื่อให้เสร็จสิ้น:
ฉันต้องการฆ่ากระบวนการทั้งหมดที่เชื่อมต่อกับพอร์ตเฉพาะ แต่ไม่ใช่กระบวนการฟัง
คำสั่ง (ใน cmd เชลล์) สำหรับพอร์ต 9001 คือ:
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P
findstr :
netstat :
ใช้งานได้เนื่องจาก netstat พิมพ์พอร์ตต้นทางจากนั้นพอร์ตปลายทางจากนั้นจึงก่อตั้งขึ้น
หากคุณต้องการฆ่ากระบวนการที่ฟังบนพอร์ต 8080 คุณสามารถใช้ PowerShell เพียงรวมGet-NetTCPConnection
cmdlet กับStop-Process
.
ทดสอบแล้วและควรใช้กับ PowerShell 5 บน Windows 10 หรือ Windows Server 2016 อย่างไรก็ตามฉันเดาว่าควรใช้กับ Windows รุ่นเก่าที่ติดตั้ง PowerShell 5 ด้วย
นี่คือตัวอย่าง:
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"):
คล้ายกับการตอบสนองของ Merlyn แต่กรณีนี้จัดการกับกรณีเหล่านี้ด้วย:
นี่คือ:
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.
)
ขั้นตอน:
ไปที่conf
โฟลเดอร์ของเซิร์ฟเวอร์apache tomcatของคุณ ในกรณีของฉันมันapache-tomcat-7.0.61\conf
เป็นเพราะฉันใช้ apache-tomcat-7.0.61
เปิดserver.xml
และเปลี่ยนหมายเลขพอร์ตจาก 8080 เป็นพอร์ตอื่น ๆ ตามที่คุณต้องการ ตัวอย่างเช่น 8081,8082,8087 เป็นต้น
ตอนนี้ไปที่bin
โฟลเดอร์และเรียกใช้shutdown.bat
ตอนนี้รีสตาร์ทเซิร์ฟเวอร์ผ่าน eclipse
ตอนนี้โครงการของคุณจะทำงานโดยไม่มีการหยุดชะงัก
หากใครกำลังมองหา 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)
}
}
โดยพื้นฐานแล้วฟังก์ชันนี้จะทำหน้าที่ของฟังก์ชันข้างต้น แต่อยู่ในรูปแบบการเขียนสคริปต์ Powershell ดังนั้นคุณจึงสามารถเพิ่มลงในโปรไฟล์ Powershell ในการค้นหาตำแหน่งโปรไฟล์ของคุณให้ไปที่ powershell แล้วพิมพ์echo $profile
netstat
เครื่องมือ
วางสิ่งนี้ในบรรทัดคำสั่ง
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)
หากคุณต้องการใช้ในแบทช์ pu %%P
แทน%P
netstat
เครื่องมือถูกแปลเป็นภาษาอื่น
ถ้าคุณตามระบบคุณไม่สามารถยุติภารกิจได้ ลองใช้คำสั่งนี้
x:> หยุดสุทธิ http / y