ฉันเปิดพอร์ต # 5955 จากคลาส java เพื่อสื่อสารจากไคลเอนต์ ฉันจะปิดพอร์ตนี้หลังจากที่ทำเสร็จแล้วได้อย่างไร และคำสั่งใดที่สามารถแสดงให้ฉันเห็นถ้าพอร์ตเปิดหรือปิด?
ฉันเปิดพอร์ต # 5955 จากคลาส java เพื่อสื่อสารจากไคลเอนต์ ฉันจะปิดพอร์ตนี้หลังจากที่ทำเสร็จแล้วได้อย่างไร และคำสั่งใดที่สามารถแสดงให้ฉันเห็นถ้าพอร์ตเปิดหรือปิด?
คำตอบ:
ค้นหา ID กระบวนการ (PID) ซึ่งครอบครองหมายเลขพอร์ต (เช่น 5955) ที่คุณต้องการให้ฟรี
sudo lsof -i :5955
ฆ่ากระบวนการที่กำลังใช้พอร์ตโดยใช้ PID ของมัน
sudo kill -9 PID
kill PID
(ซึ่งหมายถึง -15) จากนั้นลอง -2 และ -1 -9 เป็นทางเลือกสุดท้ายหากทุกตัวเลือกอื่น ๆ ล้มเหลวในการทำงาน
เพื่อค้นหากระบวนการลอง:
sudo lsof -i :portNumber
ฆ่ากระบวนการที่กำลังใช้พอร์ตโดยใช้ PID ของมัน
kill PID
จากนั้นตรวจสอบเพื่อดูว่าพอร์ตถูกปิด ถ้าไม่ลอง:
kill -9 PID
ฉันจะทำสิ่งต่อไปนี้หากก่อนหน้านี้ไม่ทำงาน
sudo kill -9 PID
เพียงเพื่อความปลอดภัย ทั้งนี้ขึ้นอยู่กับวิธีที่คุณเปิดพอร์ตสิ่งนี้อาจไม่สำคัญ
อย่างไรก็ตามคุณเปิดพอร์ตคุณปิดพอร์ตในลักษณะเดียวกัน ตัวอย่างเช่นถ้าคุณสร้างซ็อกเก็ตให้ผูกเข้ากับพอร์ต 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
คำสั่ง
ง่ายมากหาพอร์ต 5900:
sudo lsof -i :5900
จากนั้นพิจารณา 59553 เป็น PID
sudo kill 59553
ในปี 2018 นี่คือสิ่งที่ฉันใช้กับ MacOS HighSierra:
sudo lsof -nPi: yourPortNumber
แล้ว:
sudo kill -9 yourPID Number
lsof -nPi
ดีกว่าเล็กน้อยเนื่องจากหมายเลขพอร์ตสามารถมองเห็นได้ในผลลัพธ์และคุณจะได้รับความรู้สึกที่ดีขึ้นในสิ่งที่คุณกำลังฆ่า
sudo lsof -nPi | grep LISTEN
สายการบินหนึ่งที่ดีที่สุด
kill -9 $(lsof -i:PORT -t) 2> /dev/null
ตัวอย่าง: บน mac ต้องการล้างพอร์ต 9604 คำสั่งต่อไปนี้ทำงานเหมือนเครื่องราง
kill -9 $(lsof -i:9604 -t) 2> /dev/null
คุณยังสามารถใช้คำสั่งแรกนี้เพื่อฆ่ากระบวนการที่เป็นเจ้าของพอร์ตเฉพาะ:
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) ถ้าทำได้
ไชโย
ผู้ชาย.
ฉันใช้lsof
ร่วมกับkill
ตามที่กล่าวไว้ข้างต้น แต่เขียนสคริปต์ทุบตีเล็ก ๆ น้อย ๆ อย่างรวดเร็วเพื่อให้กระบวนการนี้เป็นไปโดยอัตโนมัติ
กับสคริปต์นี้คุณก็สามารถพิมพ์ได้จากทุกที่และมันจะฆ่ากระบวนการทั้งหมดที่ทำงานในพอร์ตkillport 3000
3000
lsof
เมื่อรวมกับkill
ไม่ได้ส่งคืนสิ่งใดและทำให้สคริปต์ของฉันค้างอยู่บน macOS Sierra แต่killport
ทำงานเหมือนจับใจและเร็วขึ้น ขอบคุณ!
ฉันได้สร้างฟังก์ชั่นเพื่อการนี้
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
คัดลอกและวางบล็อคของรหัสนี้ในเทอร์มินัลของคุณควรเพิ่มพอร์ตที่คุณต้องการ เพียงจำไว้ว่าให้เปลี่ยนหมายเลขพอร์ตในบรรทัดสุดท้าย
ลองด้านล่างสมมติว่าพอร์ตที่ใช้คือ8000
:
free-port() { kill "$(lsof -t -i :8000)"; }
ฉันพบข้อมูลอ้างอิงที่นี่
เมื่อโปรแกรมที่เปิดพอร์ตออกจากนั้นพอร์ตจะถูกปิดโดยอัตโนมัติ หากคุณฆ่ากระบวนการ Java ที่ใช้เซิร์ฟเวอร์นี้ควรทำเช่นนั้น
ก่อนอื่นหารหัส Procees (pid) ซึ่งครอบครองพอร์ตที่ต้องการ (เช่น 5434)
ps aux | grep 5434
2. ฆ่ากระบวนการนั้น
kill -9 <pid>