วัน: 28 กุมภาพันธ์ 2010

kill port scriptkill port script

ตอนที่ทำ server บางทีก็เจอว่ามัน kill port ไม่ครบ มี process run ตายอยู่ ไม่ยอมจากไปซักที เลยเขียน function kill port shell script ไว้ทำการล้างบางให้มันจบ ๆ ไป


ฟังก์ชันด้านล่างนี้จะเช็คก่อนว่ามี Process ไหนรันอยู่บน Port นั้นบ้าง ถ้ามีก็จะแสดงรายชื่อออกมาก่อน แล้วทำการส่ง SIGTERM (Kill แบบปกติ) หากยังมี Process ค้างอยู่ มันจะตามด้วย SIGKILL (Force Kill) ทันทีครับ

คุณสามารถก๊อปปี้ฟังก์ชันนี้ไปวางในไฟล์สคริปต์ของคุณ หรือใส่ไว้ใน ~/.bashrc หรือ ~/.zshrc เพื่อเรียกใช้ได้ตลอดเวลาครับ

kill_port() {
    # รับค่า Port จาก Argument แรก
    local PORT=$1

    # ตรวจสอบว่าได้ระบุ Port มาหรือไม่
    if [ -z "$PORT" ]; then
        echo "❌ กรุณาระบุ Port เช่น: kill_port 8080"
        return 1
    fi

    echo "🔍 กำลังตรวจสอบ Process บน Port: $PORT..."

    # ค้นหา PIDs ที่ใช้งาน Port นั้น (รองรับทั้ง TCP และ UDP)
    local PIDS=$(lsof -t -i :"$PORT")

    if [ -z "$PIDS" ]; then
        echo "✅ ไม่มี Process ไหนใช้งาน Port $PORT อยู่"
        return 0
    fi

    echo "⚠️ พบ Process IDs ด้านล่างนี้กำลังรันอยู่:"
    echo "$PIDS"
    echo "--------------------------------"

    # ลูปเพื่อ Kill ทุก PID ที่เจอ
    for PID in $PIDS; do
        echo "⚡ กำลังส่งสัญญาณ Kill ไปที่ PID: $PID"
        
        # ลอง Kill แบบปกติก่อน (SIGTERM)
        kill "$PID" 2>/dev/null
        sleep 0.5

        # ตรวจสอบว่า Process ตายหรือยัง ถ้ายัง... จัดการ Force Kill (SIGKILL)
        if kill -0 "$PID" 2>/dev/null; then
            echo "🔥 Process ไม่ยอมดับ... กำลัง Force Kill (PID: $PID)"
            kill -9 "$PID" 2>/dev/null
        fi
    done

    echo "🎉 เคลียร์ Port $PORT เรียบร้อยแล้ว!"
}

วิธีนำไปใช้งาน

  1. สร้างไฟล์สคริปต์ หรือใส่ใน Profile: หากต้องการใช้เป็นคำสั่งติดเครื่อง ให้เปิดไฟล์โปรไฟล์ของคุณ (เช่น nano ~/.bashrc หรือ nano ~/.zshrc) แล้วนำ Code ด้านบนไปวางไว้ท้ายไฟล์
  2. Apply คำสั่ง
    source ~/.bashrc # หรือ source ~/.zshrc
  3. เรียกใช้งาน
    kill_port 8080

💡 ข้อควรระวัง

  • หาก Port นั้นถูกใช้งานโดย Process ของระบบหรือ User อื่น (เช่น Nginx, Apache) คุณอาจจะต้องรันคำสั่งด้วยสิทธิ์ root โดยใช้ sudo kill_port 80 ครับ
  • คำสั่งนี้จำเป็นต้องมี lsof ติดตั้งอยู่ในเครื่อง (โดยปกติบน macOS และ Linux ส่วนใหญ่จะมีมาให้คำสั่งพื้นฐานอยู่แล้ว)

อ่านเพิ่มเติม