คำสั่ง Oneliner ใช้ kill กำหนดหมายเลขพอร์ต tcp แทน PID?


8

ฉันมักจะทำเช่น

sudo netstat -lpn |grep :8088

ดูผลลัพธ์

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

แล้ว

sudo kill -kill 11189

ฉันต้องการคำสั่งที่สะดวกยิ่งขึ้นเหมือนกับkillatport 8088ที่ใช้หมายเลขพอร์ต tcp เป็นตัวแปรและฉันสามารถสร้างเป็นนามแฝงของไพพ์ไลน์ที่ทำในสิ่งที่ฉันต้องการได้ แต่ฉันจะรับ PID จากเอาต์พุตและไพพ์ได้อย่างไร ไปที่คำสั่ง kill หรือไม่? ฉันคิดว่าฉันอาจใช้ awk เพื่อรับ PID จากเอาต์พุตจาก netstat แต่ฉันจะป้องกันและสร้างพอร์ตที่ตรงกันได้อย่างไรเพื่อให้อินพุต 80 ไม่ตรงกับ 8080 และเช่นเดียวกัน ฉันควรทำให้โปรแกรม C เป็นโปรแกรมแทนหรือไม่ หรือมียูทิลิตี้ขนาดเล็กเช่นนี้แล้ว


1
ใช้ SIGKILL มักจะเป็นความคิดที่ดี เหตุผลใดที่คุณไม่ต้องการให้กระบวนการทำความสะอาดหลังจากนั้น
geirha

หยุดเซิร์ฟเวอร์เป็นอาจล้มเหลวถ้าเช่นมีmvn jetty:stop OutOfMemoryErrorเมื่อฉันเริ่มต้นใหม่ Servlets Java mvn jetty:stopมันเกิดขึ้นว่าพอร์ตที่ไม่สามารถใช้ได้แม้ในการหยุดปกติเช่น บางครั้งกระบวนการที่สามารถรับOutOfMemoryErrorและจะไม่ฟรีพอร์ต TCP mvn jetty:stopที่ปิดปกติเช่น
Niklas

1
ยังคงmvn jetty:stopไม่เหมือนกับการส่ง SIGTERM และ jvm ควรจะสามารถประมวลผล SIGTERM ได้แม้ว่าแอปพลิเคชันจะไม่มี mem
geirha

คำตอบ:



2

คำสั่งสามารถกำหนดได้ดังนี้:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

คำอธิบาย:

  1. netstat -ltpn

    • นี่แสดงรายการพอร์ตการฟัง ( l) บน TCP ( t) และโปรแกรม ( p) โดยไม่แก้ไขหมายเลขพอร์ตเป็นชื่อ ( n)
  2. grep ":1234\b"

    • สิ่งนี้จะค้นหา:1234ตามด้วยขอบเขต ( \b) เพื่อระบุจุดสิ้นสุดของคำ (หรือตัวเลขในกรณีของเรา) สิ่งนี้ทำให้แน่ใจว่าเราไม่ได้:12345เป็นตัวอย่าง
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • นี้

      • ทดแทน sub(/regex/,"replacewith", #fieldnumber)
      • regex นี้ \/.*
      • ด้วยอะไร ""
      • ในฟิลด์$NFซึ่งหมายถึงฟิลด์สุดท้าย (เช่นฟิลด์ที่มีPID/program)
      • print $NFแล้วพิมพ์มัน

      regex \/.*ตรงกับตัวอักษร/และทุกอย่างหลังจากนั้นเราจะแทนที่มันโดยไม่มีอะไรเลยโดยการลบมันออกไปดังนั้นเราจึงเหลือเพียงหมายเลข PID ในฟิลด์นั้น

  4. xargs -i kill -kill {}

    • xargs -iเป็นโปรแกรมที่อนุญาตให้คุณสร้างเอาต์พุตของคำสั่งก่อนหน้าทำหน้าที่เป็นอินพุตไปยังคำสั่งอื่น คำสั่งของเราคือkill -kill {}ตำแหน่งที่{}บ่งชี้ "เอาต์พุตจากคำสั่งก่อนหน้าในไพพ์ไลน์" ซึ่งเป็นหมายเลข PID ของเรา

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

หากคุณต้องการทำให้สิ่งนี้เป็นฟังก์ชั่นคุณสามารถเพิ่มสิ่งต่อไปนี้ใน~/.bashrc:

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

source ~/.bashrcบันทึกและใช้การเปลี่ยนแปลงโดยใช้ ตอนนี้คุณสามารถใช้ฟังก์ชั่นเช่นนี้:

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