คุณกำลังถามคำถามผิดที่นี่ เป็นไปไม่ได้ที่จะ "ปิดพอร์ต" จากภายนอกแอปพลิเคชันที่เปิดซ็อกเก็ตกำลังฟังอยู่ วิธีเดียวที่จะทำเช่นนี้คือการฆ่ากระบวนการที่เป็นเจ้าของพอร์ตอย่างสมบูรณ์ จากนั้นประมาณหนึ่งหรือสองนาทีพอร์ตจะพร้อมใช้งานอีกครั้ง นี่คือสิ่งที่เกิดขึ้น (หากคุณไม่สนใจให้ข้ามไปยังจุดสิ้นสุดที่ฉันแสดงให้คุณเห็นวิธีฆ่ากระบวนการที่เป็นเจ้าของพอร์ตเฉพาะ):
พอร์ตคือทรัพยากรที่จัดสรรโดยระบบปฏิบัติการไปยังกระบวนการต่าง ๆ คล้ายกับการถามตัวชี้ไฟล์ อย่างไรก็ตามไม่เหมือนกับพอยน์เตอร์ของไฟล์กระบวนการเดียวเท่านั้นในแต่ละครั้งอาจเป็นเจ้าของพอร์ต ผ่านส่วนต่อซ็อกเก็ต BSD กระบวนการสามารถทำการร้องขอให้รับฟังพอร์ตซึ่งระบบปฏิบัติการจะให้อนุญาต ระบบปฏิบัติการจะตรวจสอบให้แน่ใจว่าไม่มีกระบวนการอื่นที่ได้รับพอร์ตเดียวกัน ณ จุดใด ๆ กระบวนการสามารถปล่อยพอร์ตโดยการปิดซ็อกเก็ต ระบบปฏิบัติการจะเรียกคืนพอร์ต อีกทางเลือกหนึ่งหากกระบวนการสิ้นสุดลงโดยไม่ปล่อยพอร์ตในที่สุดระบบปฏิบัติการจะเรียกคืนพอร์ตในที่สุด (แม้ว่าจะไม่เกิดขึ้นทันที: จะใช้เวลาสองสามนาที)
ตอนนี้สิ่งที่คุณต้องการ (เพียงปิดพอร์ตจากบรรทัดคำสั่ง) เป็นไปไม่ได้ด้วยเหตุผลสองประการ ขั้นแรกหากเป็นไปได้ก็หมายความว่ากระบวนการหนึ่งสามารถขโมยทรัพยากรของกระบวนการอื่น (พอร์ต) ได้ นี่จะเป็นนโยบายที่ไม่ดีเว้นแต่จะ จำกัด เฉพาะกระบวนการที่ได้รับการยกเว้น เหตุผลที่สองคือมันไม่ชัดเจนว่าจะเกิดอะไรขึ้นกับกระบวนการที่เป็นเจ้าของพอร์ตถ้าเราปล่อยให้มันทำงานต่อไป รหัสของกระบวนการเขียนโดยสมมติว่ามันเป็นเจ้าของทรัพยากรนี้ ถ้าเราเอามันออกไปมันจะจบลงด้วยตัวของมันเองดังนั้นระบบปฏิบัติการจะไม่ยอมให้คุณทำเช่นนี้แม้ว่าคุณจะเป็นกระบวนการที่มีสิทธิพิเศษก็ตาม คุณต้องฆ่าพวกมันแทน
อย่างไรก็ตามนี่คือวิธีฆ่ากระบวนการที่เป็นเจ้าของพอร์ตเฉพาะ:
sudo netstat -ap | grep :<port_number>
ที่จะส่งออกสายที่สอดคล้องกับพอร์ตการถือครองกระบวนการตัวอย่างเช่น:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
ในกรณีนี้procHoldingPortเป็นชื่อของกระบวนการที่เปิดพอร์ต4683เป็น pid และ8000 (โปรดทราบว่ามันคือ TCP) คือหมายเลขพอร์ตที่เก็บไว้
จากนั้นดูในคอลัมน์สุดท้ายคุณจะเห็น / จากนั้นดำเนินการนี้:
kill <pid>
หากไม่ได้ผล (คุณสามารถตรวจสอบได้โดยเรียกใช้คำสั่ง netstat อีกครั้ง) ทำเช่นนี้:
kill -9 <pid>
โดยทั่วไปควรหลีกเลี่ยงการส่ง SIGKILL ถ้าทำได้ นี่คือเหตุผลที่ผมบอกให้คุณลองก่อนkill
kill -9
เพียงแค่ใช้kill
ส่งอ่อนโยนกว่า SIGTERM
อย่างที่ฉันบอกไปมันจะใช้เวลาสักครู่ก่อนที่พอร์ตจะเปิดใหม่หากคุณทำเช่นนี้ ฉันไม่รู้วิธีที่จะเร่งความเร็วนี้ หากมีคนอื่นทำฉันชอบที่จะได้ยินมัน