ฉันจะปิดพอร์ตที่เปิดจากเทอร์มินัลบน Mac ได้อย่างไร


199

ฉันเปิดพอร์ต # 5955 จากคลาส java เพื่อสื่อสารจากไคลเอนต์ ฉันจะปิดพอร์ตนี้หลังจากที่ทำเสร็จแล้วได้อย่างไร และคำสั่งใดที่สามารถแสดงให้ฉันเห็นถ้าพอร์ตเปิดหรือปิด?


1
คุณเปิดพอร์ตนั้นได้อย่างไร ไม่ชัดเจนว่าคุณกำลังพูดถึงการเปิดและปิดพอร์ตในแอปพลิเคชัน java หรือจากไฟร์วอลล์
mariosangiorgio

คำตอบ:


398
  1. ค้นหา ID กระบวนการ (PID) ซึ่งครอบครองหมายเลขพอร์ต (เช่น 5955) ที่คุณต้องการให้ฟรี

    sudo lsof -i :5955
    
  2. ฆ่ากระบวนการที่กำลังใช้พอร์ตโดยใช้ PID ของมัน

    sudo kill -9 PID
    

33
การส่ง -9 ไม่ควรเป็นความพยายามครั้งแรกที่จะฆ่ากระบวนการและเป็นนิสัยที่แย่มาก อย่างที่ฉันจำได้คุณควรใช้ก่อนkill PID(ซึ่งหมายถึง -15) จากนั้นลอง -2 และ -1 -9 เป็นทางเลือกสุดท้ายหากทุกตัวเลือกอื่น ๆ ล้มเหลวในการทำงาน
Meow

3
ไม่ฆ่า PID โดยไม่ต้องธงใด ๆ ตามที่แนะนำโดย @Meow และทำงานให้ฉัน
โทนีลีห์

40

เพื่อค้นหากระบวนการลอง:

sudo lsof -i :portNumber

ฆ่ากระบวนการที่กำลังใช้พอร์ตโดยใช้ PID ของมัน

kill PID

จากนั้นตรวจสอบเพื่อดูว่าพอร์ตถูกปิด ถ้าไม่ลอง:

kill -9 PID

ฉันจะทำสิ่งต่อไปนี้หากก่อนหน้านี้ไม่ทำงาน

sudo kill -9 PID

เพียงเพื่อความปลอดภัย ทั้งนี้ขึ้นอยู่กับวิธีที่คุณเปิดพอร์ตสิ่งนี้อาจไม่สำคัญ


26

อย่างไรก็ตามคุณเปิดพอร์ตคุณปิดพอร์ตในลักษณะเดียวกัน ตัวอย่างเช่นถ้าคุณสร้างซ็อกเก็ตให้ผูกเข้ากับพอร์ต 0.0.0.0:5955 และเรียกว่า Listen ให้ปิดซ็อกเก็ตเดียวกันนั้น

คุณสามารถฆ่ากระบวนการที่เปิดพอร์ตได้

หากคุณต้องการทราบว่ากระบวนการใดที่พอร์ตเปิดอยู่ให้ลองทำดังนี้:

lsof -i :5955

หากคุณต้องการทราบว่าพอร์ตเปิดอยู่หรือไม่คุณสามารถทำคำสั่ง lsof เดียวกัน (หากกระบวนการใดเปิดไว้หรือไม่เปิดอยู่มิฉะนั้นจะไม่เปิด) หรือคุณสามารถลองเชื่อมต่อกับมันได้เช่น:

nc localhost 5955

หากส่งคืนทันทีโดยไม่มีเอาต์พุตพอร์ตจะไม่เปิด

อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่าในทางเทคนิคการพูดไม่ใช่พอร์ตที่เปิดอยู่ แต่เป็นโฮสต์: การรวมกันของพอร์ต ตัวอย่างเช่นหากคุณต่อสาย LAN เป็น 10.0.1.2 คุณสามารถผูกซ็อกเก็ตกับ 127.0.0.1:5955 หรือ 10.0.1.2:5955 โดยไม่ต้องเชื่อมต่อกับซ็อกเก็ตอื่นหรือคุณอาจผูกกับ 0.0.0.0 : 5955 เพื่อจัดการทั้งสองในครั้งเดียว คุณสามารถดูที่อยู่ IPv4 และ IPv6 ของคอมพิวเตอร์ทั้งหมดได้ด้วยifconfigคำสั่ง


24

ง่ายมากหาพอร์ต 5900:

sudo lsof -i :5900

จากนั้นพิจารณา 59553 เป็น PID

sudo kill 59553

1
สิ่งนี้จะไม่เพิ่มอะไรให้กับคำตอบที่มีอยู่!
เกลียดชัง

16

ในปี 2018 นี่คือสิ่งที่ฉันใช้กับ MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

แล้ว:

sudo kill -9 yourPID Number


1
lsof -nPiดีกว่าเล็กน้อยเนื่องจากหมายเลขพอร์ตสามารถมองเห็นได้ในผลลัพธ์และคุณจะได้รับความรู้สึกที่ดีขึ้นในสิ่งที่คุณกำลังฆ่า
Rich Stone

1
นอกจากนี้ยังเป็นประโยชน์เพียงเพื่อดูข้อมูลทั้งหมดฟังพอร์ต:sudo lsof -nPi | grep LISTEN
ลีแอนน์

15

สายการบินหนึ่งที่ดีที่สุด

kill -9 $(lsof -i:PORT -t) 2> /dev/null

ตัวอย่าง: บน mac ต้องการล้างพอร์ต 9604 คำสั่งต่อไปนี้ทำงานเหมือนเครื่องราง

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 

6

คุณยังสามารถใช้คำสั่งแรกนี้เพื่อฆ่ากระบวนการที่เป็นเจ้าของพอร์ตเฉพาะ:

sudo netstat -ap | grep :<port_number>

ตัวอย่างเช่นสมมติว่ากระบวนการนี้เก็บพอร์ต8000 TCP จากนั้นเรียกใช้คำสั่ง:

sudo netstat -ap | grep :8000

จะส่งออกสายที่สอดคล้องกับกระบวนการถือพอร์ต8000ตัวอย่างเช่น:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

ในกรณีนี้procHoldingPortเป็นชื่อของกระบวนการที่เปิดพอร์ต4683เป็น pid และ8000 (โปรดทราบว่ามันคือ TCP) คือหมายเลขพอร์ตที่เก็บ (ซึ่งคุณต้องการปิด)

จากนั้นฆ่ากระบวนการโดยทำตามตัวอย่างด้านบน:

kill  4683

ตามที่คนอื่นพูดถึงที่นี่ถ้าไม่ได้ผล (คุณสามารถลองใช้ kill ด้วย -9 เป็นอาร์กิวเมนต์):

kill -9 4683

โดยทั่วไปควรหลีกเลี่ยงการส่ง SIGKILL (-9) ถ้าทำได้

ไชโย

ผู้ชาย.


5

ฉันใช้lsofร่วมกับkillตามที่กล่าวไว้ข้างต้น แต่เขียนสคริปต์ทุบตีเล็ก ๆ น้อย ๆ อย่างรวดเร็วเพื่อให้กระบวนการนี้เป็นไปโดยอัตโนมัติ

กับสคริปต์นี้คุณก็สามารถพิมพ์ได้จากทุกที่และมันจะฆ่ากระบวนการทั้งหมดที่ทำงานในพอร์ตkillport 30003000

https://github.com/xtrasimplicity/killport


1
คุณบันทึกวันของฉัน ด้วยเหตุผลบางอย่างlsofเมื่อรวมกับkillไม่ได้ส่งคืนสิ่งใดและทำให้สคริปต์ของฉันค้างอยู่บน macOS Sierra แต่killportทำงานเหมือนจับใจและเร็วขึ้น ขอบคุณ!
wout

4

ฉันได้สร้างฟังก์ชั่นเพื่อการนี้

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

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



1

เมื่อโปรแกรมที่เปิดพอร์ตออกจากนั้นพอร์ตจะถูกปิดโดยอัตโนมัติ หากคุณฆ่ากระบวนการ Java ที่ใช้เซิร์ฟเวอร์นี้ควรทำเช่นนั้น


-1
  1. ก่อนอื่นหารหัส Procees (pid) ซึ่งครอบครองพอร์ตที่ต้องการ (เช่น 5434)

    ps aux | grep 5434

2. ฆ่ากระบวนการนั้น

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