ฉันจะฆ่ากระบวนการในปัจจุบันโดยใช้พอร์ตบน localhost ใน Windows ได้อย่างไร


492

ฉันจะลบกระบวนการ / แอ็พพลิเคชันปัจจุบันที่กำหนดให้กับพอร์ตแล้วได้อย่างไร

ตัวอย่างเช่น: localhost:8080

คำตอบ:


1056

ขั้นตอนที่ 1:

เปิด cmd.exe (หมายเหตุ: คุณอาจจำเป็นต้องเรียกใช้ในฐานะผู้ดูแลระบบ แต่ไม่จำเป็นเสมอไป) จากนั้นเรียกใช้คำสั่งด้านล่าง:

netstat -ano | findstr :PORT_NUMBER

(แทนที่ PORT_NUMBER ด้วยหมายเลขพอร์ตที่คุณต้องการ แต่ใช้เครื่องหมายโคลอน)

พื้นที่วงกลมสีแดงแสดง PID (ตัวระบุกระบวนการ) ค้นหา PID ของกระบวนการที่ใช้พอร์ตที่คุณต้องการ

ขั้นตอนที่ 2:

ถัดไปเรียกใช้คำสั่งต่อไปนี้:

taskkill /PID PID /F

(ไม่มีลำไส้ใหญ่ในเวลานี้)

สุดท้ายคุณสามารถตรวจสอบว่าการดำเนินการสำเร็จหรือไม่โดยการรันคำสั่งอีกครั้งใน "ขั้นตอนที่ 1" หากประสบความสำเร็จคุณไม่ควรเห็นผลลัพธ์การค้นหาหมายเลขพอร์ตนั้นอีก


ไม่ทำงาน. กระบวนการยังคงแสดงอยู่
Hardik Mandankaa

16
ทำงานได้อย่างสมบูรณ์แบบ ในกรณีของฉัน Tomcat ทำงานในพอร์ต 8080 และฉันต้องเปิดแอพ Spring อีกครั้ง i.imgur.com/aVwSYvR.png ขอบคุณมาก
Hugo LM

16
ผมต้องป้อนตัวอักษรหลบหนีเมื่อทำงาน taskkill:taskkill //PID 12552 //F
โรเบิร์ต

1
คำตอบที่ได้รับการยอมรับจะไม่ทำงานสำหรับบริการที่ตั้งค่าให้รีสตาร์ทเมื่อเกิดความล้มเหลว (ไม่ใช่ลินุกซ์)
nurettin

1
ฉันคิดว่าคุณหมายถึง PID_NUMBER และไม่ใช่ PORT_NUMBER ในtaskkill /PID PORT_NUMBER /F
Marcin Kulik

132

ขั้นตอนที่ 1 (เหมือนกันคือคำตอบที่ยอมรับโดยKavinduWije ):

netstat -ano | findstr :yourPortNumber

เปลี่ยนในขั้นตอนที่ 2 เป็น:

tskill typeyourPIDhere 

หมายเหตุ : taskkillใช้งานไม่ได้ในเทอร์มินัล git bash บางตัว


1
ไม่พบมันสำหรับฉัน
Tzvi Gregory Kaidanov

1
@TzviGregoryKaidanov คุณกำลังเผชิญกับปัญหาอะไร
afsarkhan10182

1
ขอบคุณมันทำงานโดยการเปลี่ยน taskkill เป็น tskill
Md Shoaib Alam

1
นี่คือทางออกที่ได้ผลสำหรับฉัน ฉันใช้ GIT Bash
dxhans5

1
สามารถทำได้โดยการส่งออกคำสั่งแรกไปยัง seond?
James

115

ด้วยเครื่องมือเริ่มต้นของ Windows 10:

  • ขั้นตอนแรก:

เปิด Windows PowerShell ในฐานะผู้ดูแลระบบ

  • ขั้นตอนที่สอง:

ค้นหา PID (ProcessID) สำหรับพอร์ต 8080:

netstat -aon | findstr 8080

TCP 0.0.0.0:8080 0.0.0.0+ LISTEN 77777

  • ขั้นตอนที่สาม:

ฆ่ากระบวนการซอมบี้:

taskkill /f /pid 77777

โดยที่ "77777" เป็น PID ของคุณ


1
วิธีการดำเนินการอัตโนมัติและรวมสองคำสั่งเหล่านี้เข้าด้วยกันในไฟล์ bat หนึ่งไฟล์หากไม่มีความเป็นไปได้ที่จะดูเอาต์พุต cmd แล้วเขียนคำสั่งใหม่ด้วยตนเอง?
Serob_b

3
@Serob_b set /p port="Enter port: "-> พอร์ตอินพุต FOR /F "tokens=5" %%T IN ('netstat -aon ^| findstr %port% ') DO ( SET /A ProcessId=%%T) &GOTO SkipLine :SkipLine-> แยก PID ออกเป็นตัวแปร taskkill /f /pid %ProcessId%-> ฆ่าภารกิจ cmd /k -> เปิดหน้าต่างไว้
Vikrant

94

หากคุณใช้ GitBash

ขั้นตอนแรก:

netstat -ano | findstr :8080

ขั้นตอนที่สอง:

taskkill /PID typeyourPIDhere /F 

( /Fยุติกระบวนการอย่างเด็ดขาด)


เฉือนสองครั้งไม่ได้ผลสำหรับฉัน
kylexy1357

2
@ kylexy1357 ลองด้วยเครื่องหมายสแลชเดี่ยว "double slash" เป็นตัวละคร escape ที่อยู่ข้างหน้า / ซึ่งไม่จำเป็นสำหรับเชลล์บางตัว
Robert

27

ในWindows PowerShellเวอร์ชัน 1 หรือใหม่กว่าเพื่อหยุดกระบวนการในประเภทพอร์ต 3000:

Stop-Process (, (netstat -ano | findstr: 3000) .split () | foreach {$ [$ .length-1]}) -Force


ตามที่แนะนำโดย @morganpdx ที่นี่มี PowerShell-ish มากกว่ารุ่นที่ดีกว่า:

หยุดกระบวนการ -Id (Get-NetTCPConnection -LocalPort 3000) การเป็นเจ้าของกระบวนการ - บังคับใช้


'Stop-Process' is not recognized as an internal or external command,
Green

3
ฉันพบว่ามันใช้งานได้:Stop-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess -Force
morganpdx

1
@Green คุณต้องเรียกใช้คำสั่งใน Windows PowerShell
todorm

1
ข้อผิดพลาดอย่างแรกคือ seconf ทำงานให้ฉัน
Tom

24

สำหรับใช้ในบรรทัดคำสั่ง:

for /f "tokens=5" %a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %a

สำหรับใช้ในไฟล์ bat:

for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %%a

1
ถ้าคุณต้องการที่จะทำใน. bat แทนที่% a สำหรับ %% a
Mahesh Narwade

23

หากคุณทราบหมายเลขพอร์ตแล้วอาจพอเพียงที่จะส่งสัญญาณการเลิกจ้างซอฟต์แวร์ไปยังกระบวนการ (SIGTERM):

kill $(lsof -t -i :PORT_NUMBER)

หากคุณรู้ว่าพอร์ตกำลังใช้ IPv4 คุณสามารถทำได้lsof -nt -i4TCP:9001เช่นกัน
Josh Habdas

10

สำหรับผู้ใช้ Windows คุณสามารถใช้เครื่องมือCurrPortsเพื่อฆ่าพอร์ตภายใต้การใช้งานได้อย่างง่ายดาย:

ป้อนคำอธิบายภาพที่นี่


10

ฉันใช้งาน Zookeeper บน Windows และไม่สามารถหยุดZooKeeper ที่ทำงานที่พอร์ต 2181 โดยใช้ zookeeper-stop.sh ดังนั้นให้ลองใช้วิธีการเฉือน "//" สองครั้งนี้กับ taskkill มันได้ผล

     1. netstat -ano | findstr :2181
       TCP    0.0.0.0:2181           0.0.0.0:0              LISTENING       8876
       TCP    [::]:2181              [::]:0                 LISTENING       8876

     2.taskkill //PID 8876 //F
       SUCCESS: The process with PID 8876 has been terminated.

6

หากคุณใช้Windows Terminalกระบวนการฆ่าอาจน่าเบื่อน้อยลง ฉันใช้เทอร์มินัล windows และkill PIDทำงานได้ดีสำหรับฉันที่จะฆ่ากระบวนการบนพอร์ตเนื่องจาก Windows Terminal ใหม่รองรับคำสั่ง bash บางคำสั่ง ตัวอย่างเช่น:kill 13300

ดังนั้นกระบวนการที่สมบูรณ์จะมีลักษณะเช่นนี้ -

  • เปิด Windows Terminal
  • พิมพ์คำสั่งต่อไปนี้เพื่อแสดงกระบวนการทำงานบนพอร์ตที่คุณต้องการฆ่ากระบวนการ netstat -ano | findstr :PORT
  • พิมพ์ต่อไปนี้เพื่อฆ่ากระบวนการ kill PID

ตัวอย่างเช่น:

PS C:\Users\username> netstat -ano | findstr :4445
  TCP    0.0.0.0:4445           0.0.0.0:0              LISTENING       7368
  TCP    [::]:4445              [::]:0                 LISTENING       7368
PS C:\Users\username> kill 7368
PS C:\Users\username> netstat -ano | findstr :4445
PS C:\Users\username>

ดูเมื่อฉันพิมพ์คำสั่งแรกเพื่อแสดงรายการกระบวนการบนพอร์ตที่ส่งคืนว่าง นั่นหมายความว่ากระบวนการทั้งหมดจะถูกฆ่าในขณะนี้


ฉันรู้ว่ามันใช้งานได้เพราะฉันทดสอบแล้วฉันพยายามหาเอกสารรอบตัวคุณมีอะไรบ้าง?
DanStarns

@ ด่านที่ฉันได้พบเพียงแค่นี้! docs.microsoft.com/en-us/windows/terminal
lazycipher

ขอบคุณสำหรับเวลาของคุณก็ไม่ได้ค่อนข้างหน้าฉันกำลังมองหา, killหน้าเว็บที่มีฟังก์ชั่นทั้งหมดที่มีให้บริการในสถานีเช่น ไม่โพสต์ที่นี่ถ้าฉันพบ
DanStarns

1
ตอนนี้ฉันยังไม่พบอะไรมาก กรุณาโพสต์ถ้าคุณพบอะไร
lazycipher

4

คุณสามารถทำได้โดยเรียกใช้ไฟล์ค้างคาว:

@ECHO OFF                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr "9797" ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

4

ในกรณีที่คุณต้องการใช้ Python: check เป็นไปได้ไหมที่ python จะฆ่าโพรเซสที่กำลังฟังบนพอร์ตเฉพาะเช่น 8080?

คำตอบจากSmunkทำงานได้ดี ฉันทำซ้ำรหัสของเขาที่นี่:

from psutil import process_iter
from signal import SIGTERM # or SIGKILL

for proc in process_iter():
    for conns in proc.connections(kind='inet'):
        if conns.laddr.port == 8080:
            proc.send_signal(SIGTERM) # or SIGKILL
            continue

สิ่งนี้ใช้ได้กับซ็อกเก็ตที่ใช้หมายเลขพอร์ตเฉพาะใน Google Cloud เช่นกัน! ขอบคุณตัน
peevesy

0

โซลูชันบรรทัดเดียวที่ใช้GitBash :

 tskill `netstat -ano | grep LISTENING | findstr :8080 | sed -r 's/(\s+[^\s]+){4}(.*)/\1/'`

แทนที่8080ด้วยพอร์ตที่เซิร์ฟเวอร์ของคุณกำลังรับฟัง

หากคุณต้องการใช้งานบ่อยให้ลองเพิ่ม~/.bashrcฟังก์ชั่นของคุณ:

function killport() {
        tskill `netstat -ano | findstr LISTENING | findstr :$1 | sed -r 's/^(\s+[^\s]+){4}(\d*)$/\1/'`
}

และเพียงแค่เรียกใช้

killport 8080

-1

เราสามารถหลีกเลี่ยงปัญหานี้ได้โดยการเริ่มต้น IIS ใหม่โดยใช้คำสั่งด้านล่าง:

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