ในการใช้งานระบบปฏิบัติการ 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ร่วมกับgrepps aux | grep nginx - ใช้
pgrep(สั้นและสะดวกกว่า)pgrep nginx
(คำสั่งนี้จะคืนค่าเฉพาะหมายเลข PID ของโปรเซสชื่อ nginx มาให้ทันที)
ตัวอย่างการใช้งานจริง (Step-by-Step)
ลำดับการปิด Process อย่างปลอดภัย (Best Practice)
เมื่อต้องการปิดโปรแกรมที่ทำงานผิดปกติ ห้ามใช้ kill -9 เป็นอย่างแรกเด็ดขาด ให้เริ่มจากวิธีสุภาพก่อนเสมอตามลำดับดังนี้
- สั่งปิดแบบปกติ (SIGTERM)
kill 1234
หรือเขียนเต็มแบบนี้kill -15 1234
kill -SIGTERM 1234
ทำไมต้องเริ่มที่วิธีนี้? เพราะโปรแกรมจะทำการบันทึกข้อมูลและปิดตัวเองอย่างปลอดภัย ไม่ทำให้ไฟล์ระบบเสียหาย - ตรวจสอบว่าปิดไปหรือยัง
pgrep -l 1234
หากไม่มีอะไรแสดงขึ้นมา แสดงว่าโปรแกรมปิดตัวลงสำเร็จแล้ว - ใช้ไม้แข็งเมื่อโปรแกรมค้าง (SIGKILL)
หากปล่อยไว้สักพักแล้วโปรแกรมยังไม่ยอมปิด (เช่น มีอาการหลุดค้าง หรือกลายเป็น Zombie Process) ให้ใช้สัญญาณเด็ดขาดkill -9 1234
หรือkill -SIGKILL 1234
คำสั่งในตระกูลเดียวกัน: pkill และ killall
ถ้าคุณไม่อยากเสียเวลาหา PID ระบบ Linux มีคำสั่งทางเลือกที่ช่วยให้คุณส่ง Signal ผ่าน “ชื่อของ Process” ได้โดยตรง
pkill: ส่งสัญญาณไปยัง Process โดยอ้างอิงจากชื่อ (บางส่วนของชื่อก็ใช้งานได้)pkill -9 nginxkillall: ส่งสัญญาณไปยัง ทุกๆ Process ที่มีชื่อตรงตามที่ระบุอย่างแม่นยำkillall firefox
💡 ข้อควรระวังในการใช้งาน
- สิทธิ์ในการใช้งาน (Permission)
คุณสามารถkillโปรเซสที่เป็นของ User ตัวเองได้เท่านั้น หากต้องการปิดโปรเซสของระบบหรือของ User อื่น ต้องใช้sudoนำหน้า เช่นsudo kill 1234 - ระวังการใช้
kill -9กับ Database
การใช้SIGKILLกับระบบฐานข้อมูล (เช่น MySQL, PostgreSQL) ขณะที่กำลังเขียนข้อมูลลงดิสก์ อาจทำให้ไฟล์ข้อมูลพังหรือ Corrupt ได้
อ่านเพิ่มเติม
