วิธีการฆ่ากระบวนการทำงานบนพอร์ตเฉพาะใน Linux?


761

ฉันพยายามปิด tomcat ที่ใช้./shutdown.shจาก/binไดเรกทอรีtomcat แต่พบว่าเซิร์ฟเวอร์ไม่ได้ปิดอย่างถูกต้อง และทำให้ผมไม่สามารถที่จะเริ่มต้นใหม่คราวของฉันทำงานอยู่ในพอร์ต
8080

8080ฉันต้องการที่จะฆ่ากระบวนการคราวที่ทำงานบน ฉันต้องการให้รายการกระบวนการทำงานบนพอร์ตเฉพาะ (8080) เพื่อเลือกกระบวนการที่จะฆ่า


คำตอบ:


936

นี่fuser 8080/tcpจะพิมพ์ PID ของกระบวนการที่ผูกไว้กับพอร์ตนั้น

และนี่fuser -k 8080/tcpจะเป็นการฆ่ากระบวนการนั้น

ทำงานบน Linux เท่านั้น การใช้งานที่เป็นสากลมากขึ้นคือlsof -i4(หรือ 6 สำหรับ IPv6)


2
นี้จะปิดซ็อกเก็ตเชื่อมต่อที่เป็นไปได้เพื่อ 8080 เช่นกัน?
Fer Y

9
มันปิดพอร์ตไม่ถูกต้อง พอร์ตถูกย้ายเข้าสู่สถานะ TIME_WAIT หลังจากกระบวนการหลักถูกฆ่า ในที่สุดระบบปฏิบัติการจะปิดพอร์ตโดยสมบูรณ์หลังจากผ่านไปประมาณ 60 วินาที หมายความว่าคุณไม่สามารถใช้พอร์ตซ้ำเป็นเวลาอย่างน้อย 60 วินาที (เว้นแต่คุณจะให้ตัวเลือกการใช้ซ้ำกับซ็อกเก็ต)
Mark Lakata

2
บนดาร์วินต้องใช้เวอร์ชั่นfuserอื่น -kใช้เวลาเพียงไฟล์ที่ไม่สนับสนุน
AP

3
'fuser -k -n tcp 8080' จะฆ่ากระบวนการด้วย
Hesham Yassin

7
@dbliss fuser เป็นส่วนหนึ่งของ psmisc ในกรณีที่คุณได้รับfuser: command not foundติดตั้ง psmisc สำหรับ CentOS / RHEL 7 ให้รันsudo yum install psmisc
Tom

699

ในการแสดงรายการกระบวนการใด ๆ ที่ฟังพอร์ต 8080:

lsof -i:8080

หากต้องการฆ่ากระบวนการใด ๆ ที่ฟังพอร์ต 8080:

kill $(lsof -t -i:8080)

หรือมากกว่านั้นอย่างรุนแรง:

kill -9 $(lsof -t -i:8080)

( -9ตรงกับSIGKILL - terminate immediately/hard killสัญญาณ: ดูรายการ Kill Signalsและจุดประสงค์ของตัวเลือก -9 ในคำสั่ง kill คืออะไร?ถ้าไม่มีการระบุkillสัญญาณสัญญาณ TERM สัญญาณ aka -15หรือsoft killถูกส่งซึ่งบางครั้งไม่เพียงพอที่จะฆ่า กระบวนการ)


9
kill: การใช้งาน: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... หรือ kill -l [sigspec] นี่คือสิ่งที่ฉันได้รับเมื่อฉันรันคำสั่งของคุณ
Sudhir Belagali

2
@SudhirBelagali ทำได้กับผู้ใช้ระดับสูงsudo
Marcel Djaman

5
ทำงานบน Mac ของฉันด้วย
asherbar

2
ผมอยากจะเพิ่มว่าบางครั้งคุณไม่ได้รับอนุญาตให้ดูกระบวนการ id sudo lsof -i:8080ในกรณีที่คุณต้องทำ
Akavall

1
ทำไมเคล็ดลับที่สองจึงมีความรุนแรงมากกว่า
Webwoman

281

ใช้คำสั่ง

 sudo netstat -plten |grep java

ใช้grep javaเป็นtomcatใช้javaเป็นกระบวนการของพวกเขา

มันจะแสดงรายการของกระบวนการที่มีหมายเลขพอร์ตและรหัสกระบวนการ

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

หมายเลขก่อนหน้า/javaคือ id กระบวนการ ตอนนี้ใช้killคำสั่งเพื่อฆ่ากระบวนการ

kill -9 16085

-9 บอกเป็นนัย ๆ ว่ากระบวนการนั้นจะถูกฆ่าอย่างรุนแรง


11
คุณอาจต้องการที่จะเพิ่มที่หนึ่งอาจ privilegues netstatรากจำเป็นที่จะต้องได้รับชื่อกระบวนการผ่าน
Jonas Schäfer

2
@JonasWielicki คุณสามารถเห็นสิ่งที่คุณเป็นเจ้าของโดยไม่ต้องใช้สิทธิ์รูท
dbliss

ฉันต้องการสิทธิ์รูทสำหรับ netstat มีวิธีที่จะรู้ว่ากระบวนการมาจากไหน? เท่าที่ฉันสามารถบอกได้ว่าฉันปิดแอปพลิเคชันทั้งหมด แต่อาจมาจากหน้าต่างเทอร์มินัลที่ฉันผลักกระบวนการโดยไม่ตั้งใจไปยังงานพื้นหลัง บางทีฉันควรจะได้วิ่งคำสั่งมินัล 'PS' เพื่อดูกระบวนการทั้งหมดที่แรก ...
JesseBoyd

150

ฉันจะเพิ่มหนึ่งซับเพื่อฆ่าเฉพาะฟังก์ชั่นเฉพาะพอร์ต:

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)


9
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด ขอบคุณ @Gal Bracha
Sam Kah Chiin

2
นี่เป็นทางออกที่ดีที่สุดเพราะมันไม่ได้ฆ่าเบราว์เซอร์ของฉันเช่นกัน!
รุสโซ

คำตอบที่ดีที่สุด! ง่ายกระชับและทำงานได้อย่างถูกต้อง
Tsar Bomba

116

คุณสามารถใช้คำสั่ง lsof ให้หมายเลขพอร์ตเหมือนที่นี่คือ 8090

lsof -i:8090

คำสั่งนี้ส่งคืนรายการกระบวนการที่เปิดอยู่บนพอร์ตนี้

สิ่งที่ต้องการ…

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)

หากต้องการทำให้พอร์ตว่างให้ฆ่ากระบวนการโดยใช้ (รหัสกระบวนการคือ 75782) ...

kill -9 75782

อันนี้ใช้ได้สำหรับฉัน นี่คือลิงค์จากโพสต์ต้นฉบับ: ลิงค์


1
เพื่อฆ่ากระบวนการอย่างรุนแรงคุณจะต้องใช้ -9 เช่น kill -9 75782; เนื่องจากบางครั้งกระบวนการบางอย่างไม่ได้ถูกฆ่าด้วยเพียงแค่ฆ่า
veer7

73

หากคุณต้องการที่จะฆ่ากระบวนการที่ทำงานบนหมายเลขพอร์ต 8080 ก่อนอื่นคุณต้องค้นหาหมายเลขประจำตัวของกระบวนการพอร์ต 8080 (PID) จากนั้นฆ่ามัน รันคำสั่งต่อไปนี้เพื่อค้นหาหมายเลขพอร์ต 8080 PID:

sudo lsof -t -i:8080

ที่นี่

  • sudo - คำสั่งถามสิทธิ์ผู้ดูแลระบบ (ID ผู้ใช้และรหัสผ่าน)
  • lsof - รายชื่อของไฟล์ (นอกจากนี้ยังใช้สำหรับรายการกระบวนการที่เกี่ยวข้อง)
  • -t - แสดง ID กระบวนการเท่านั้น
  • -i - แสดงกระบวนการเชื่อมต่ออินเทอร์เน็ตที่เกี่ยวข้องเท่านั้น
  • : 8080 - แสดงเฉพาะกระบวนการในหมายเลขพอร์ตนี้

ดังนั้นตอนนี้คุณสามารถฆ่า PID ของคุณได้อย่างง่ายดายโดยใช้คำสั่งต่อไปนี้:

sudo kill -9 <PID>

ที่นี่

  • kill - คำสั่งเพื่อฆ่ากระบวนการ
  • -9 - แรง

คุณสามารถใช้หนึ่งคำสั่งเพื่อฆ่ากระบวนการบนพอร์ตเฉพาะโดยใช้คำสั่งต่อไปนี้:

sudo kill -9 $(sudo lsof -t -i:8080)

สำหรับข้อมูลเพิ่มเติมคุณสามารถดูลิงค์ต่อไปนี้ วิธีฆ่ากระบวนการในพอร์ตเฉพาะบน linux


ขอบคุณเพื่อน sudo kill -9 $(sudo lsof -t -i:8080)ทำงานให้ฉัน
มิ.ย.

69

วิธีที่ดีที่สุดในการฆ่ากระบวนการทั้งหมดในพอร์ตเฉพาะ

kill -9 $(sudo lsof -t -i:8080)

1
ทำงาน! ขอบคุณ
Fred

มันใช้งานได้! ขอบคุณ
Jaylers

ทางออกที่ง่ายอย่างน่าอัศจรรย์โดยใช้ subshell ขอบคุณ!
Jason R Stevens CFA

ไม่ sudo ให้ใส่รหัสผ่าน
Kuldeep Yadav

41

สิ่งนี้พิมพ์เพื่อ stdout รหัสกระบวนการของทุกสิ่งที่ทำงานอยู่<port_number>:

fuser -n tcp <port_number> 

นอกจากนี้ยังพิมพ์บางสิ่งไปยัง stderr ด้วยดังนั้น:

fuser -n tcp <port_number> 2> /dev/null

จากนั้นเราสามารถจัดหารหัสกระบวนการเหล่านี้ให้กับkillคำสั่ง:

sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

คุณสามารถใส่ฟังก์ชั่นนี้ได้ถ้าคุณทำมันมาก:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}

35

รับ PID ของงานและฆ่ามัน

lsof -ti:8080 | xargs kill

ขอบคุณสำหรับคำตอบ. ทำงานได้อย่างราบรื่นมากใน Mac OS คุณคือสุดยอด เพิ่งโหวต
AMIC MING

1
ทำงานได้ดีกับช่วงพอร์ตเช่นlsof -ti:8080-8089 | xargs killกัน
dvlsg

34

หากต้องการทราบ pid ของบริการที่ทำงานบนพอร์ตเฉพาะ:

netstat -tulnap | grep :*port_num*

คุณจะได้รับรายละเอียดของกระบวนการนั้น ตอนนี้ใช้ kill หรือ kill -9 pid ฆ่าได้ง่าย

เช่น

netstat -ap | grep :8080

tcp6       0      0 :::8080       :::*    LISTEN      1880/java 

ขณะนี้:

kill -9 1880

อย่าลืมเรียกใช้คำสั่งทั้งหมดเป็น root


29

หนึ่งในสายการบิน

kill -9 $(lsof -t -i tcp:8080)

คำอธิบายที่นี่: ใช้การรวมกันของ lsof and kill

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

เลือก pid และใช้ kill

kill 23672


16

เลือกหมายเลขพอร์ตและใช้ grep ในคำสั่งnetstatดังที่แสดงด้านล่าง

netstat -ap | grep :7070

เอาต์พุตคอนโซล

tcp 0 0 ::: 7070 ::: * ฟัง 3332 / java

ฆ่าบริการตามPID (หมายเลขประจำตัวของกระบวนการ)

kill -9 3332

13
  1. lsof -i tcp:8000 คำสั่งนี้แสดงข้อมูลเกี่ยวกับกระบวนการทำงานในพอร์ต 8000

  2. kill -9 [PID] คำสั่งนี้ฆ่ากระบวนการ


ฉันเพิ่งสังเกตเห็นว่าฉัน downvote นี้โดยไม่กี่สัปดาห์ที่ผ่านมาถ้าคุณแก้ไข anwer ของคุณเล็กน้อยฉันควรจะสามารถลบออกได้
Robin-Hoodie

12

Linux : ขั้นแรกคุณสามารถค้นหา PID ของคำสั่งนี้หากคุณรู้จักพอร์ต:

netstat -tulpn 

ตัวอย่าง:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

จากนั้นคุณใช้กระบวนการฆ่า เรียกใช้คำสั่งต่อไปนี้:

kill -9 PID

ตัวอย่าง: -

ฆ่า -9 15986


10

Linux : คุณสามารถใช้คำสั่งนี้หากคุณรู้จักพอร์ต:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

จากนั้นคุณจะใช้คอลัมน์แรก (ตัวอย่าง: f100050000b05bb8) และเรียกใช้คำสั่งต่อไปนี้:

rmsock f100050000b05bb8 tcpcb

กระบวนการฆ่า


10

คุณสามารถทราบรายการพอร์ตทั้งหมดที่ทำงานในระบบพร้อมรายละเอียด (pid ที่อยู่ ฯลฯ ):

netstat -tulpn

คุณสามารถทราบรายละเอียดของหมายเลขพอร์ตเฉพาะได้โดยระบุหมายเลขพอร์ตในคำสั่งต่อไปนี้:

sudo netstat -lutnp | grep -w '{port_number}'

เช่น: sudo netstat -lutnp | grep -w '8080' รายละเอียดจะได้รับเช่นนี้:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

ถ้าคุณต้องการที่จะฆ่ากระบวนการโดยใช้ pid แล้ว :kill -9 {PID}

ถ้าคุณต้องการที่จะฆ่ากระบวนการโดยใช้หมายเลขพอร์ต :fuser -n tcp {port_number}

ใช้sudoหากคุณไม่สามารถเข้าถึงได้


6

kill -9 `fuser 8080/tcp|xargs -n 1`คำสั่งนี้ยังฆ่ากระบวนการที่ฟังพอร์ต 8080 ด้วยการเชื่อมต่อ TCP


4
sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

ผลลัพธ์: 80 / tcp: 1858 1867 1868 1869 1871

ฆ่ากระบวนการทีละคน

ฆ่า -9 1858


3

ฉันกำลังทำงานกับระบบ Yocto Linux ที่มีชุดเครื่องมือ Linux ที่มีอยู่อย่าง จำกัด ฉันต้องการฆ่ากระบวนการที่ใช้พอร์ตเฉพาะ (1883)

ก่อนอื่นเพื่อดูว่าเราฟังพอร์ตใดใช้คำสั่งต่อไปนี้:

root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      

ต่อไปฉันพบชื่อกระบวนการโดยใช้พอร์ต 1883 ด้วยวิธีต่อไปนี้:

root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290

อย่างที่เราเห็นด้านบนมันเป็นโปรแกรม/usr/sbin/mosquittoที่ใช้พอร์ต 1883

สุดท้ายฉันได้ฆ่ากระบวนการ:

root@root:~# systemctl stop mosquitto

ฉันใช้systemctlเพราะในกรณีนี้มันเป็นบริการ systemd


2

ในกรณีของฉัน cent os มีปัญหาในคำตอบที่แนะนำ ดังนั้นฉันจึงใช้วิธีแก้ปัญหาต่อไปนี้:

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill

1

เพื่อสร้างสิ่งที่ @ veer7กล่าวไว้:

ถ้าคุณต้องการที่จะรู้ว่าสิ่งที่อยู่ในพอร์ตทำเช่นนี้ก่อนที่คุณจะฆ่ามัน

$ sudo netstat -plten |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
$ ps 25296
  PID TTY      STAT   TIME COMMAND
25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom

ใช้ 'ps' และจำนวนของกระบวนการที่ netstat รายงานกลับมา


1

วิธีอื่นด้วย Git Bash:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}

1
  1. ก่อนตรวจสอบกระบวนการ netstat -lt
  2. ตรวจสอบ id กระบวนการ fuser <port number>/tcp
  3. ฆ่ากระบวนการทำงานบนพอร์ต kill <process id>

-3

ใน Windows มันจะเป็นnetstat -ano | grep "8080"และเราได้รับข้อความต่อไปนี้TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

เราสามารถฆ่า PID ได้โดยใช้ taskkill /F /PID 10076


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