ป้ายกำกับ: exceeded

Linux: Kill ตั้งชื่อได้โหดแต่มีโหมด KittyLinux: Kill ตั้งชื่อได้โหดแต่มีโหมด Kitty

ในการใช้งานระบบปฏิบัติการ Linux หรือ Unix หลายคนมักเข้าใจผิดว่าคำสั่ง kill มีไว้เพื่อ “ฆ่า” หรือธีมกระบวนการ (Process) ให้ตายลงทันทีเท่านั้น แต่ในความเป็นจริง หน้าที่หลักของ kill คือการ ส่งสัญญาณ (Signals) ไปยัง Process เพื่อสั่งให้มันทำงานบางอย่างตามที่เราต้องการ โดยการบังคับจบการทำงานเป็นเพียงแค่หนึ่งในสัญญาณเหล่านั้นครับ


โครงสร้างพื้นฐานของคำสั่ง (Syntax)

รูปแบบการใช้งานคำสั่ง kill มีโครงสร้างง่ายๆ ดังนี้
kill [options]
PID (Process ID): หมายเลขประจำตัวของ Process ที่เราต้องการส่งสัญญาณไปหา (สามารถหาได้จากคำสั่ง ps, top หรือ htop)


Signals คืออะไร? (สัญญาณที่พบบ่อยที่สุด)

ระบบ Linux มี Signal มากกว่า 60 ชนิด แต่ในการใช้งานจริง มีเพียงไม่กี่ตัวที่ถูกใช้งานบ่อย ๆ

Signal NameSignal Numberความหมายและการใช้งาน
SIGTERM15สัญญาณเตือนแบบสุภาพ (Default): บอกให้ Process ปิดตัวลง โดยให้เวลาเคลียร์ไฟล์ เคลียร์หน่วยความจำ หรือบันทึกข้อมูลที่ค้างอยู่ก่อนปิด
SIGKILL9ฆ่าทันทีแบบไร้เงื่อนไข: ใช้เมื่อ Process ค้าง (Freeze) ไม่ตอบสนองต่อ SIGTERM ตัวระบบปฏิบัติการจะตัดจบ Process นั้นทันที โดยไม่สนว่าข้อมูลจะเสียหายหรือไม่
SIGHUP1โหลด Config ใหม่ (Hangup): แจ้งให้ Process เริ่มต้นตัวเองใหม่ (Restart) หรือโหลดไฟล์ Configuration ใหม่ โดยไม่ต้องปิดบริการ (มักใช้กับ Web Server เช่น Nginx หรือ Apache)
SIGSTOP19หยุดทำงานชั่วคราว: สั่งให้ Process หยุดนิ่งอยู่กับที่ (Pause) แต่ยังค้างอยู่ในหน่วยความจำ

คุณสามารถดูรายชื่อ Signal ทั้งหมดในเครื่องได้ด้วยคำสั่ง
kill -l

NumberSignal Nameความหมาย / การทำงานพื้นฐาน
1SIGHUPHangup (สั่งให้รีโหลด Configuration ใหม่)
2SIGINTInterrupt จากคีย์บอร์ด (เหมือนการกด Ctrl + C)
3SIGQUITQuit จากคีย์บอร์ด (เหมือน Ctrl + \ และจะทำ Core dump)
4SIGILLIllegal Instruction (พบคำสั่งที่ทำงานไม่ได้ในระดับฮาร์ดแวร์)
5SIGTRAPTrace/breakpoint trap (ใช้ในการดีบั๊กโปรแกรม)
6SIGABRTAbort (สั่งให้ยกเลิกการทำงาน มักเกิดจากฟังก์ชัน abort())
7SIGBUSBus error (การเข้าถึงหน่วยความจำที่ผิดพลาดระดับฮาร์ดแวร์)
8SIGFPEFloating-point exception (การคำนวณทางคณิตศาสตร์ที่ผิดพลาด เช่น หารด้วยศูนย์)
9SIGKILLKill signal (บังคับปิดทันที ไม่สามารถดักจับหรือเพิกเฉยได้)
10SIGUSR1User-defined signal 1 (สัญญาณที่ผู้ใช้/โปรแกรมเมอร์กำหนดเอง)
11SIGSEGVSegmentation fault (โปรแกรมพยายามอ่าน/เขียนหน่วยความจำที่ไม่มีสิทธิ์)
12SIGUSR2User-defined signal 2 (สัญญาณที่ผู้ใช้/โปรแกรมเมอร์กำหนดเอง)
13SIGPIPEBroken pipe (พยายามเขียนข้อมูลลงใน Pipe ที่ไม่มีตัวรับแล้ว)
14SIGALRMAlarm clock (สัญญาณแจ้งเตือนเมื่อหมดเวลาที่ตั้งไว้)
15SIGTERMTermination signal (สั่งปิดโปรแกรมแบบสุภาพ – ค่า Default ของคำสั่ง kill)
16SIGSTKFLTStack fault on coprocessor (ข้อผิดพลาดของ Stack)
17SIGCHLDChild status changed (Process ลูกหยุดทำงานหรือจบการทำงาน)
18SIGCONTContinue (สั่งให้ Process ที่ถูกหยุดกลับมาทำงานต่อ)
19SIGSTOPStop process (สั่งหยุดการทำงานชั่วคราว ไม่สามารถดักจับได้)
20SIGTSTPStop typed at terminal (สั่งหยุดชั่วคราวจากการกด Ctrl + Z)
21SIGTTINTerminal input for background process (Process เบื้องหลังพยายามอ่าน Input)
22SIGTTOUTerminal output for background process (Process เบื้องหลังพยายามแสดง Output)
23SIGURGUrgent data on socket (มีข้อมูลด่วนเข้ามาในช่องทางเน็ตเวิร์ก)
24SIGXCPUCPU time limit exceeded (ใช้งาน CPU เกินเวลาที่กำหนดไว้)
25SIGXFSZFile size limit exceeded (พยายามสร้างไฟล์ที่มีขนาดใหญ่เกินกำหนด)
26SIGVTALRMVirtual alarm clock (สัญญาณเตือนจากเวลาเสมือนของ CPU)
27SIGPROFProfiling timer expired (ใช้ในการวัดประสิทธิภาพโปรแกรม)
28SIGWINCHWindow resize signal (หน้าจอ Terminal มีการเปลี่ยนขนาด)
29SIGIO / SIGPOLLI/O now possible (เกิดเหตุการณ์เกี่ยวกับ Input/Output)
30SIGPWRPower failure (ระบบแจ้งเตือนเมื่อไฟดับ/กำลังจะปิดตัว)
31SIGSYSBad system call (เรียกใช้ฟังก์ชันระบบที่ไม่ถูกต้อง)

วิธีการค้นหา PID ก่อนสั่ง Kill

ก่อนจะส่งสัญญาณไปหาใคร เราต้องรู้ “ที่อยู่” หรือ PID ของเขาก่อน โดยมีวิธีหาหลักๆ ดังนี้

  • ใช้ ps aux ร่วมกับ grep
    ps aux | grep nginx
  • ใช้ pgrep (สั้นและสะดวกกว่า)
    pgrep nginx
    (คำสั่งนี้จะคืนค่าเฉพาะหมายเลข PID ของโปรเซสชื่อ nginx มาให้ทันที)

ตัวอย่างการใช้งานจริง (Step-by-Step)

ลำดับการปิด Process อย่างปลอดภัย (Best Practice)

เมื่อต้องการปิดโปรแกรมที่ทำงานผิดปกติ ห้ามใช้ kill -9 เป็นอย่างแรกเด็ดขาด ให้เริ่มจากวิธีสุภาพก่อนเสมอตามลำดับดังนี้

  1. สั่งปิดแบบปกติ (SIGTERM)
    kill 1234
    หรือเขียนเต็มแบบนี้
    kill -15 1234
    kill -SIGTERM 1234

    ทำไมต้องเริ่มที่วิธีนี้? เพราะโปรแกรมจะทำการบันทึกข้อมูลและปิดตัวเองอย่างปลอดภัย ไม่ทำให้ไฟล์ระบบเสียหาย
  2. ตรวจสอบว่าปิดไปหรือยัง
    pgrep -l 1234
    หากไม่มีอะไรแสดงขึ้นมา แสดงว่าโปรแกรมปิดตัวลงสำเร็จแล้ว
  3. ใช้ไม้แข็งเมื่อโปรแกรมค้าง (SIGKILL)
    หากปล่อยไว้สักพักแล้วโปรแกรมยังไม่ยอมปิด (เช่น มีอาการหลุดค้าง หรือกลายเป็น Zombie Process) ให้ใช้สัญญาณเด็ดขาด
    kill -9 1234
    หรือ
    kill -SIGKILL 1234

คำสั่งในตระกูลเดียวกัน: pkill และ killall

ถ้าคุณไม่อยากเสียเวลาหา PID ระบบ Linux มีคำสั่งทางเลือกที่ช่วยให้คุณส่ง Signal ผ่าน “ชื่อของ Process” ได้โดยตรง

  • pkill: ส่งสัญญาณไปยัง Process โดยอ้างอิงจากชื่อ (บางส่วนของชื่อก็ใช้งานได้)
    pkill -9 nginx
  • killall: ส่งสัญญาณไปยัง ทุกๆ Process ที่มีชื่อตรงตามที่ระบุอย่างแม่นยำ
    killall firefox

💡 ข้อควรระวังในการใช้งาน

  1. สิทธิ์ในการใช้งาน (Permission)
    คุณสามารถ kill โปรเซสที่เป็นของ User ตัวเองได้เท่านั้น หากต้องการปิดโปรเซสของระบบหรือของ User อื่น ต้องใช้ sudo นำหน้า เช่น sudo kill 1234
  2. ระวังการใช้ kill -9 กับ Database
    การใช้ SIGKILL กับระบบฐานข้อมูล (เช่น MySQL, PostgreSQL) ขณะที่กำลังเขียนข้อมูลลงดิสก์ อาจทำให้ไฟล์ข้อมูลพังหรือ Corrupt ได้

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