ฆ่ากระบวนการโดยค้นหาพอร์ตที่ใช้โดย. BAT


128

ใน Windows มีอะไรบ้างที่สามารถมองหาพอร์ต 8080 และพยายามฆ่ากระบวนการที่ใช้ผ่านไฟล์. BAT


ฉันสามารถให้คุณเป็นส่วนหนึ่งของวิธีที่นั่น ... จากพรอมต์คำสั่งใช้คำสั่ง 'netstat -a -n -o' และคุณจะเห็นรายการกระบวนการและพอร์ตที่พวกเขากำลังฟังอยู่ (เช่นเดียวกับ ip และไม่ว่าจะเป็น มีการเชื่อมต่อกับ IP อื่นหรือไม่ .. ) ล้ำค่า เกือบจะมีสวิตช์ที่ดีกว่าเพื่อปรับแต่งผลลัพธ์ แต่ฉันจำมันไม่ได้ ... หวังว่าจะมีใครสามารถสร้างสิ่งนี้ได้?
Dave

ในลินุกซ์คุณสามารถทำได้ หากคุณติดตั้ง cygwin คุณจะสามารถใช้งานได้เช่นกัน
Dani

@Dani, Mike: Cygwin เป็นแหล่งพึ่งพาที่ยิ่งใหญ่และไม่จำเป็นต้องแก้ปัญหานี้ หากคุณมีอยู่แล้วให้ใช้ - เครื่องมือบรรทัดคำสั่ง linux ดีกว่ามาก
Merlyn Morgan-Graham

คำตอบ:


141

นี่คือคำสั่งในการเริ่มต้น:

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=5tokens=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แทน


คุณอาจต้องเล่นกับสัญญาณ delims ฯลฯ ตรวจสอบHELP FORในบรรทัดคำสั่งที่จะเห็นจำนวนมากของตัวเลือกอื่น ๆ ที่FORจะช่วยให้คุณและตรวจสอบnetstat -?, findstr /?และTaskKill /?สำหรับความช่วยเหลือมากยิ่งขึ้น
Merlyn Morgan-Graham

ฉันจะลองใช้และติดต่อกลับ
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
นี่มันเยี่ยมมาก tokens=4ฉันคิดว่า Windows XP และtokens=5Windows 7 เป็นความคิดที่ดีที่จะ/Fบังคับให้ฆ่า
Strelok

1
@ MerlynMorgan-Graham เนื่องจากเป็นคำตอบที่ได้รับการยอมรับโปรดพิจารณาเพิ่มคะแนนจากstackoverflow.com/a/20637662/5243762คำตอบนี้ด้วย
IAmSurajBobade

196

เปิดพรอมต์คำสั่งและรันคำสั่งต่อไปนี้

 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 คือรหัสกระบวนการ


ใช่ว่าจะแตกต่างกันไปทุกที่
Mohit Singh

3
มีประโยชน์มาก ! โปรดทราบว่าฉันค้นหา: 3000 แทนที่จะเป็น 0.0: 3000 เพราะอาจต่ำกว่า 127.0.01 แทนที่จะเป็น 0.0.0.0
Leeeeeeelo

2
ขอขอบคุณคุณได้งานที่ดีฆ่าออกจากการควบคุมงาน webpack dev :)
danjah

หรือคุณอาจให้ netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F ที่นี่ 9797 คือหมายเลขพอร์ต iI มักใช้คำสั่งนี้เพื่อฆ่าเซิร์ฟเวอร์ที่ทำงานผิดปกติ / แฮงค์
Mohit Singh

53

หากต้องการค้นหากระบวนการเฉพาะในบรรทัดคำสั่งให้ใช้คำสั่งด้านล่างที่นี่ 8080 คือพอร์ตที่ใช้โดยกระบวนการ

netstat -ano | findstr 8080

เพื่อฆ่ากระบวนการใช้คำสั่งด้านล่างที่นี่ 21424 คือรหัสกระบวนการ

taskkill /pid 21424 /F 

@EralpB Enjoy :)
Girdhar Singh Rathore

19

การใช้โซลูชันของ 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

18

หากต้องการแสดงรายการกระบวนการทั้งหมดที่ทำงานบนพอร์ต 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


13

ขอบคุณทุกคนเพียงเพื่อเพิ่มว่ากระบวนการบางอย่างจะไม่ปิดเว้นแต่ว่าสวิตช์บังคับ / 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


3

สร้างไฟล์ 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" เพื่อออก


@TusharPandey นี่คือคำถามที่ติดแท็กของ windows ดังนั้นจึงเป็นสคริปต์ของ windows ไม่ใช่เชลล์สคริปต์
Sireesh Yarlagadda

2

เพียงเพื่อให้เสร็จสิ้น:

ฉันต้องการฆ่ากระบวนการทั้งหมดที่เชื่อมต่อกับพอร์ตเฉพาะ แต่ไม่ใช่กระบวนการฟัง

คำสั่ง (ใน cmd เชลล์) สำหรับพอร์ต 9001 คือ:

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

findstr :

  • r คือนิพจน์และ c สำหรับ chain ที่ตรงกันทั้งหมด
  • [] * ใช้สำหรับช่องว่างที่ตรงกัน

netstat :

  • a -> ทั้งหมด
  • n -> ไม่แก้ไข (เร็วกว่า)
  • o -> pid

ใช้งานได้เนื่องจาก netstat พิมพ์พอร์ตต้นทางจากนั้นพอร์ตปลายทางจากนั้นจึงก่อตั้งขึ้น


1

หากคุณต้องการฆ่ากระบวนการที่ฟังบนพอร์ต 8080 คุณสามารถใช้ PowerShell เพียงรวมGet-NetTCPConnectioncmdlet กับ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"):

0

คล้ายกับการตอบสนองของ 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.
)

0

ขั้นตอน:

  1. ไปที่confโฟลเดอร์ของเซิร์ฟเวอร์apache tomcatของคุณ ในกรณีของฉันมันapache-tomcat-7.0.61\confเป็นเพราะฉันใช้ apache-tomcat-7.0.61

  2. เปิดserver.xmlและเปลี่ยนหมายเลขพอร์ตจาก 8080 เป็นพอร์ตอื่น ๆ ตามที่คุณต้องการ ตัวอย่างเช่น 8081,8082,8087 เป็นต้น

  3. ตอนนี้ไปที่binโฟลเดอร์และเรียกใช้shutdown.bat

  4. ตอนนี้รีสตาร์ทเซิร์ฟเวอร์ผ่าน eclipse

ตอนนี้โครงการของคุณจะทำงานโดยไม่มีการหยุดชะงัก


0

หากใครกำลังมองหา 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


1
นี่ไม่ใช่สคริปต์ PowerShell จริงๆ แต่เป็น Wrapper ที่ใช้ PowerShell รอบ ๆnetstatเครื่องมือ
bahrep

0

วางสิ่งนี้ในบรรทัดคำสั่ง

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

หากคุณต้องการใช้ในแบทช์ pu %%Pแทน%P


ขึ้นอยู่กับภาษาของระบบปฏิบัติการวิธีใดที่จะทำให้มันใช้งานได้กับทุกภาษา?
Jakob

@Jakob สิ่งนี้สามารถเรียกใช้ในเทอร์มินัล cmd ใน Windows เท่านั้นรวมถึงในไฟล์. cmd หรือ. bat เท่านั้น
Eduard Florinescu

ใช่ แต่เป็นภาษาอังกฤษเท่านั้นเนื่องจากมิฉะนั้น "LISTENING" จะถูกแปลเป็นภาษาของระบบปฏิบัติการ
Jakob

@Jakob ฉันไม่ทราบว่าnetstatเครื่องมือถูกแปลเป็นภาษาอื่น
Eduard Florinescu

0

ถ้าคุณตามระบบคุณไม่สามารถยุติภารกิจได้ ลองใช้คำสั่งนี้

x:> หยุดสุทธิ http / y


3
"ถ้าคุณตามระบบ" หมายความว่าอย่างไร และคำตอบนี้ดีกว่าคำตอบอื่น ๆ อย่างไร?
Nico Haase
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.