บน Linux ทุก Program ที่ทำงานอยู่คือ Process ที่มีหมายเลขประจำตัวเรียกว่า PID (Process ID) การจัดการ Process เป็นทักษะพื้นฐานของ System Administrator ตั้งแต่การค้นหา Process ที่กินทรัพยากร การดูความสัมพันธ์ระหว่าง Parent-Child Process ไปจนถึงการหยุด Process ที่ค้างหรือทำงานผิดปกติ
บทความนี้อธิบายการใช้ ps สำหรับดูรายการ Process, Signal ต่าง ๆ ที่ใช้กับ kill, pkill และ killall สำหรับหยุด Process รวมถึง nice และ renice สำหรับปรับ Priority
ps — ดูรายการ Process
ps (Process Status) แสดงรายการ Process ณ เวลาที่รันคำสั่ง ไม่ใช่ Real-time เหมือน top/htop แต่เหมาะสำหรับ Scripting และการกรองข้อมูล
# ดู Process ของ User ปัจจุบัน (TTY ปัจจุบัน)
ps
# ดู Process ทั้งหมดในระบบ — รูปแบบ BSD
ps aux
# ดู Process ทั้งหมด — รูปแบบ POSIX (Full)
ps -ef
# ดูเฉพาะ Process ของ User ที่กำหนด
ps -u www-data
ps -u deploy
# ดู Process ที่มี PID ที่ระบุ
ps -p 1234
ps -p 1234,5678
อ่านค่าจาก ps aux
# ตัวอย่าง output ของ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169568 10240 ? Ss Apr15 0:03 /sbin/init
www-data 1234 2.1 3.5 512000 45000 ? S 10:00 0:45 nginx: worker
# คำอธิบาย Column
# USER — เจ้าของ Process
# PID — Process ID
# %CPU — เปอร์เซ็นต์ CPU
# %MEM — เปอร์เซ็นต์ RAM
# VSZ — Virtual Memory (KB) — ขนาด Virtual Address Space ทั้งหมด
# RSS — Resident Set Size (KB) — RAM ที่ใช้งานจริง
# STAT — สถานะ Process (R=Running, S=Sleeping, Z=Zombie, D=Waiting I/O)
# TIME — เวลา CPU รวมที่ใช้ไป
ค้นหาและกรอง Process
# ค้นหา Process ตามชื่อ
ps aux | grep nginx
ps aux | grep -v grep | grep nginx # ไม่รวม grep เอง
# เรียงตาม CPU Usage (สูงสุดก่อน)
ps aux --sort=-%cpu | head -10
# เรียงตาม Memory Usage
ps aux --sort=-%mem | head -10
# แสดงแบบ Tree (ดูความสัมพันธ์ Parent-Child)
ps auxf
# แสดงแบบ Tree ด้วย pstree
pstree -p # แสดง PID ด้วย
pstree -u # แสดง User ด้วย
pgrep — ค้นหา PID ตามชื่อ
# ค้นหา PID ของ Process ตามชื่อ
pgrep nginx
pgrep -l nginx # แสดงชื่อด้วย
# ค้นหาตาม User
pgrep -u www-data nginx
# ค้นหาแบบ Full Match (ชื่อต้องตรงทั้งหมด)
pgrep -x nginx
# ค้นหาและแสดง Parent PID
pgrep -P 1234 # ดู Child Process ของ PID 1234
kill — ส่ง Signal ให้ Process
คำสั่ง kill ไม่ได้แค่ “ฆ่า” Process แต่เป็นการส่ง Signal ให้ Process ซึ่ง Signal แต่ละชนิดมีความหมายต่างกัน
# Signal ที่ใช้บ่อย
# SIGTERM (15) — ขอให้ Process หยุดทำงานอย่างสุภาพ (ค่าเริ่มต้น)
# SIGKILL (9) — บังคับหยุดทันที (Process ไม่มีโอกาส cleanup)
# SIGHUP (1) — Reload Config (ไม่หยุด Process — เช่น nginx reload)
# SIGSTOP (19) — หยุด Process ชั่วคราว (Pause)
# SIGCONT (18) — ดำเนินการต่อจาก SIGSTOP
# ดูรายการ Signal ทั้งหมด
kill -l
# ส่ง SIGTERM (graceful stop) — ค่าเริ่มต้น
kill 1234
kill -15 1234
kill -SIGTERM 1234
# ส่ง SIGKILL (force kill) — ใช้เมื่อ SIGTERM ไม่ตอบสนอง
kill -9 1234
kill -SIGKILL 1234
# ส่ง SIGHUP (reload config)
kill -1 1234
kill -HUP 1234
pkill และ killall — Kill ตามชื่อ Process
แทนที่จะต้องหา PID ก่อน pkill และ killall ช่วยให้ส่ง Signal โดยระบุชื่อ Process ได้โดยตรง
# pkill — Kill Process ตามชื่อ (ค้นหาแบบ Partial Match)
pkill nginx
pkill -9 nginx # Force kill
pkill -u www-data # Kill Process ทั้งหมดของ User
pkill -HUP nginx # ส่ง SIGHUP ให้ nginx (reload config)
# killall — Kill Process ตามชื่อ (ต้องตรงทั้งหมด)
killall nginx
killall -9 nginx # Force kill
killall -HUP rsyslogd # Reload rsyslog
# ความแตกต่าง pkill vs killall
# pkill: Partial match (nginx จะ match nginxworker ด้วย), รองรับ regex
# killall: Exact match (nginx จะ match แค่ชื่อ nginx พอดี)
nice และ renice — ปรับ Process Priority
Linux กำหนด Priority ของ Process ด้วยค่า Nice ตั้งแต่ -20 (Priority สูงสุด) ถึง +19 (Priority ต่ำสุด) ค่าเริ่มต้นคือ 0 Process ที่มี Nice ต่ำกว่าจะได้รับ CPU มากกว่า
# รัน Process ใหม่พร้อมกำหนด Nice value
nice -n 10 /usr/local/bin/backup.sh # Nice +10 (ลด Priority)
nice -n -5 /path/to/critical-task # Nice -5 (เพิ่ม Priority — ต้องเป็น root)
# ปรับ Nice value ของ Process ที่รันอยู่แล้ว
renice 10 -p 1234 # ปรับ PID 1234 เป็น Nice +10
renice -5 -p 1234 # ต้องเป็น root
renice 15 -u www-data # ปรับทุก Process ของ User www-data
# ดู Nice value ของ Process
ps -o pid,ni,comm -p 1234
ps aux | awk '{print $1,$2,$18,$11}' | head -10
Process State และ Zombie Process
# สถานะ Process ใน STAT column ของ ps
# R — Running หรือ Runnable (รอ CPU)
# S — Sleeping (รอ Event เช่น I/O)
# D — Uninterruptible Sleep (รอ I/O — ไม่ตอบสนอง signal)
# T — Stopped (ถูก SIGSTOP)
# Z — Zombie (Process ตายแล้วแต่ยังอยู่ใน Process Table)
# ดู Zombie Process
ps aux | grep -w Z
# Zombie Process เกิดจาก Parent ไม่ได้ wait() รับ exit status ของ Child
# วิธีแก้: restart Parent Process (Zombie จะหายไปเอง)
# ถ้า Parent เป็น init/systemd: zombie จะถูก reap อัตโนมัติ
# ดูจำนวน Zombie ทั้งหมด
ps aux | awk '$8 == "Z"' | wc -l
ตัวอย่างการใช้งานจริง
# ตัวอย่างที่ 1 — หา Process ที่กิน CPU สูง แล้ว Kill
ps aux --sort=-%cpu | head -5
kill -15 [PID] # ลองก่อน
# ถ้าไม่ตอบสนองใน 5-10 วินาที:
kill -9 [PID]
# ตัวอย่างที่ 2 — Reload nginx config โดยไม่ต้อง restart
kill -HUP $(pgrep -x nginx | head -1)
# หรือ
pkill -HUP nginx
# ตัวอย่างที่ 3 — Kill Process ทั้งหมดที่ชื่อ python3
pkill -9 python3
# ตัวอย่างที่ 4 — รัน Backup Script ด้วย Priority ต่ำ (ไม่กระทบ Server หลัก)
nice -n 19 /usr/local/bin/backup.sh &
# ตัวอย่างที่ 5 — หา Process ที่ฟัง Port 80
ss -tlnp | grep :80
# หรือ
lsof -i :80
สรุป
การจัดการ Process บน Linux ใช้คำสั่งหลักสี่กลุ่ม ได้แก่ ps สำหรับดูรายการ Process, pgrep สำหรับค้นหา PID, kill/pkill/killall สำหรับส่ง Signal (SIGTERM=15 สำหรับ Graceful Stop, SIGKILL=9 สำหรับ Force Stop, SIGHUP=1 สำหรับ Reload), และ nice/renice สำหรับปรับ Priority ความเข้าใจเรื่อง Process State โดยเฉพาะ Zombie Process และวิธีจัดการเป็นทักษะสำคัญสำหรับ System Administrator
แนะนำบริการ DE
การจัดการ Process และ Signal บน Server จำเป็นต้องมีสิทธิ์เข้าถึงระบบอย่างเต็มที่ Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบ สามารถใช้ kill, renice และจัดการทุก Process บน Server ได้อย่างอิสระ เหมาะสำหรับการ Troubleshoot และ Optimize Production Server
หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Process เอง Cloud Hosting ของ DE มีระบบจัดการ Resource อัตโนมัติและ Monitoring ผ่าน Control Panel

