ผู้เขียน: phunsanit

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 Name Signal Number ความหมายและการใช้งาน
SIGTERM 15 สัญญาณเตือนแบบสุภาพ (Default): บอกให้ Process ปิดตัวลง โดยให้เวลาเคลียร์ไฟล์ เคลียร์หน่วยความจำ หรือบันทึกข้อมูลที่ค้างอยู่ก่อนปิด
SIGKILL 9 ฆ่าทันทีแบบไร้เงื่อนไข: ใช้เมื่อ Process ค้าง (Freeze) ไม่ตอบสนองต่อ SIGTERM ตัวระบบปฏิบัติการจะตัดจบ Process นั้นทันที โดยไม่สนว่าข้อมูลจะเสียหายหรือไม่
SIGHUP 1 โหลด Config ใหม่ (Hangup): แจ้งให้ Process เริ่มต้นตัวเองใหม่ (Restart) หรือโหลดไฟล์ Configuration ใหม่ โดยไม่ต้องปิดบริการ (มักใช้กับ Web Server เช่น Nginx หรือ Apache)
SIGSTOP 19 หยุดทำงานชั่วคราว: สั่งให้ Process หยุดนิ่งอยู่กับที่ (Pause) แต่ยังค้างอยู่ในหน่วยความจำ

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

Number Signal Name ความหมาย / การทำงานพื้นฐาน
1 SIGHUP Hangup (สั่งให้รีโหลด Configuration ใหม่)
2 SIGINT Interrupt จากคีย์บอร์ด (เหมือนการกด Ctrl + C)
3 SIGQUIT Quit จากคีย์บอร์ด (เหมือน Ctrl + \ และจะทำ Core dump)
4 SIGILL Illegal Instruction (พบคำสั่งที่ทำงานไม่ได้ในระดับฮาร์ดแวร์)
5 SIGTRAP Trace/breakpoint trap (ใช้ในการดีบั๊กโปรแกรม)
6 SIGABRT Abort (สั่งให้ยกเลิกการทำงาน มักเกิดจากฟังก์ชัน abort())
7 SIGBUS Bus error (การเข้าถึงหน่วยความจำที่ผิดพลาดระดับฮาร์ดแวร์)
8 SIGFPE Floating-point exception (การคำนวณทางคณิตศาสตร์ที่ผิดพลาด เช่น หารด้วยศูนย์)
9 SIGKILL Kill signal (บังคับปิดทันที ไม่สามารถดักจับหรือเพิกเฉยได้)
10 SIGUSR1 User-defined signal 1 (สัญญาณที่ผู้ใช้/โปรแกรมเมอร์กำหนดเอง)
11 SIGSEGV Segmentation fault (โปรแกรมพยายามอ่าน/เขียนหน่วยความจำที่ไม่มีสิทธิ์)
12 SIGUSR2 User-defined signal 2 (สัญญาณที่ผู้ใช้/โปรแกรมเมอร์กำหนดเอง)
13 SIGPIPE Broken pipe (พยายามเขียนข้อมูลลงใน Pipe ที่ไม่มีตัวรับแล้ว)
14 SIGALRM Alarm clock (สัญญาณแจ้งเตือนเมื่อหมดเวลาที่ตั้งไว้)
15 SIGTERM Termination signal (สั่งปิดโปรแกรมแบบสุภาพ – ค่า Default ของคำสั่ง kill)
16 SIGSTKFLT Stack fault on coprocessor (ข้อผิดพลาดของ Stack)
17 SIGCHLD Child status changed (Process ลูกหยุดทำงานหรือจบการทำงาน)
18 SIGCONT Continue (สั่งให้ Process ที่ถูกหยุดกลับมาทำงานต่อ)
19 SIGSTOP Stop process (สั่งหยุดการทำงานชั่วคราว ไม่สามารถดักจับได้)
20 SIGTSTP Stop typed at terminal (สั่งหยุดชั่วคราวจากการกด Ctrl + Z)
21 SIGTTIN Terminal input for background process (Process เบื้องหลังพยายามอ่าน Input)
22 SIGTTOU Terminal output for background process (Process เบื้องหลังพยายามแสดง Output)
23 SIGURG Urgent data on socket (มีข้อมูลด่วนเข้ามาในช่องทางเน็ตเวิร์ก)
24 SIGXCPU CPU time limit exceeded (ใช้งาน CPU เกินเวลาที่กำหนดไว้)
25 SIGXFSZ File size limit exceeded (พยายามสร้างไฟล์ที่มีขนาดใหญ่เกินกำหนด)
26 SIGVTALRM Virtual alarm clock (สัญญาณเตือนจากเวลาเสมือนของ CPU)
27 SIGPROF Profiling timer expired (ใช้ในการวัดประสิทธิภาพโปรแกรม)
28 SIGWINCH Window resize signal (หน้าจอ Terminal มีการเปลี่ยนขนาด)
29 SIGIO / SIGPOLL I/O now possible (เกิดเหตุการณ์เกี่ยวกับ Input/Output)
30 SIGPWR Power failure (ระบบแจ้งเตือนเมื่อไฟดับ/กำลังจะปิดตัว)
31 SIGSYS Bad 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 ได้

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