PID Linux คือ

โดย อ. บอมกิตติทัศน์เจริญพนาสิทธิ์ | อัปเดต 24 ก. พ. 2026 | อ่าน 14 นาที
- PID คืออะไร — ทำความเข้าใจ Process ID บน Linux
- กลไกการทำงานของ PID ใน Linux Kernel
- PID สำคัญในระบบ — PID 0, PID 1 และ PID 2
- คำสั่ง ps — ดูรายการ Process ทั้งหมด
- คำสั่ง top และ htop — Monitor แบบ Real-time
- คำสั่ง pgrep, pidof และ pstree
- /proc Filesystem — อ่านข้อมูล Process โดยตรง
- การจัดการ Process — kill, killall, pkill
- Linux Signals ทั้งหมดที่ควรรู้
- Process States — สถานะต่างๆของ Process
- Parent-Child Relationship และ Zombie Process
- Namespace และ PID Isolation สำหรับ Container
- ตัวอย่างการแก้ปัญหาจริง — Process กิน CPU/RAM
- Best Practices การจัดการ Process
- สรุปและ Cheat Sheet คำสั่งที่ใช้บ่อย
PID คืออะไร — ทำความเข้าใจ Process ID บน Linux
PID ย่อมาจาก Process ID หรือหมายเลขประจำตัว Process เป็นตัวเลขจำนวนเต็มบวกที่ Linux Kernel กำหนดให้กับทุก Process ที่กำลังทำงานอยู่ในระบบทุกครั้งที่โปรแกรมถูกเรียกใช้งาน Kernel จะสร้าง Process ใหม่และกำหนด PID ที่ไม่ซ้ำกับ Process อื่นที่ยังทำงานอยู่ณขณะนั้น PID ถูกใช้เป็นตัวอ้างอิงหลักในการจัดการ Process ไม่ว่าจะเป็นการส่ง Signal การตรวจสอบสถานะหรือการจัดสรรทรัพยากร
ค่าของ PID เริ่มต้นที่ 1 และเพิ่มขึ้นเรื่อยๆจนถึงค่าสูงสุดที่กำหนดไว้ในระบบซึ่งบน Linux 64-bit สมัยใหม่ค่าสูงสุดอยู่ที่ 4,194,304 (กำหนดใน /proc/sys/kernel/pid_max) เมื่อถึงค่าสูงสุดแล้วระบบจะวนกลับมาเริ่มนับใหม่โดยข้าม PID ที่ยังถูกใช้งานอยู่ทำให้มั่นใจได้ว่าจะไม่มี PID ซ้ำกันในเวลาเดียวกัน
ทุก Process ยังมี PPID (Parent Process ID) ซึ่งเป็น PID ของ Process แม่ที่สร้างมันขึ้นมาความสัมพันธ์แบบ Parent-Child นี้ทำให้ Process ทั้งหมดในระบบมีโครงสร้างเป็นแบบ Tree โดยมี PID 1 เป็นรากของต้นไม้
กลไกการทำงานของ PID ใน Linux Kernel
เมื่อโปรแกรมถูกเรียกใช้งาน Kernel จะทำงานตามลำดับดังนี้ขั้นแรก Process แม่เรียก System Call fork() เพื่อสร้างสำเนาของตัวเอง Kernel จะกำหนด PID ใหม่ให้กับ Process ลูกที่สร้างขึ้นจากนั้น Process ลูกจะเรียก exec() เพื่อแทนที่โค้ดของตัวเองด้วยโปรแกรมที่ต้องการรัน
ในระบบ Linux สมัยใหม่ที่ใช้ Kernel 5.x ขึ้นไปการจัดการ PID ถูกเปลี่ยนมาใช้โครงสร้างข้อมูลแบบ IDR (ID Radix tree) ซึ่งมีประสิทธิภาพสูงกว่าวิธีเดิมที่ใช้ Bitmap อย่างมากทำให้การค้นหา PID ว่างและการจอง PID ใหม่ทำได้รวดเร็วแม้ในระบบที่มี Process นับหมื่น
นอกจาก PID แล้วแต่ละ Process ยังมี TID (Thread ID) สำหรับ Thread, PGID (Process Group ID) สำหรับกลุ่ม Process และ SID (Session ID) สำหรับ Session ข้อมูลเหล่านี้ถูกเก็บรวมกันใน Task Structure ของ Kernel
PID สำคัญในระบบ — PID 0, PID 1 และ PID 2
PID 0 — Swapper/Idle เป็น Process พิเศษที่ทำงานอยู่ใน Kernel Space เรียกว่า Idle Process ทำหน้าที่จัดการการ Swap หน่วยความจำและทำงานเมื่อไม่มี Process อื่นต้องการ CPU คุณจะไม่เห็น Process นี้ในคำสั่ง ps เพราะมันทำงานอยู่ในระดับ Kernel โดยตรง
PID 1 — Init/systemd เป็น Process แรกที่ Kernel สร้างขึ้นหลังจากบูตเสร็จในลินุกซ์รุ่นใหม่ PID 1 คือ systemd ซึ่งทำหน้าที่เป็นบรรพบุรุษ (ancestor) ของทุก Process ในระบบมีหน้าที่สำคัญคือจัดการ Service ต่างๆรับเลี้ยง Orphan Process และเก็บกวาด Zombie Process หาก PID 1 หยุดทำงานระบบทั้งหมดจะ Kernel Panic ทันที
PID 2 — kthreadd เป็น Kernel Thread Daemon ทำหน้าที่เป็น Parent ของ Kernel Thread ทั้งหมดในระบบเช่น Thread ที่จัดการ I/O, Memory Management และ Network Stack
คำสั่ง ps — ดูรายการ Process ทั้งหมด
คำสั่ง ps (Process Status) เป็นเครื่องมือพื้นฐานที่สุดสำหรับดูข้อมูล Process มี Option ที่ใช้บ่อยหลายแบบ
# ดูทุก Process แบบ BSD syntax
ps aux
# ดูทุก Process แบบ UNIX syntax
ps -ef
# ดูเฉพาะ Process ของ user bom
ps -u bom
# ดู Process พร้อม Thread
ps -eLf
# แสดงเป็น Tree
ps axjf
# แสดงเฉพาะ Column ที่ต้องการ
ps -eo pid, ppid, user,%cpu,%mem, stat, start, command
# ค้นหา Process ชื่อ nginx
ps aux | grep nginx
ผลลัพธ์ของ ps aux จะแสดงข้อมูลสำคัญหลายคอลัมน์ได้แก่ USER (เจ้าของ Process), PID (หมายเลข Process), %CPU (เปอร์เซ็นต์ CPU ที่ใช้), %MEM (เปอร์เซ็นต์ RAM ที่ใช้), VSZ (Virtual Memory ทั้งหมด), RSS (Physical Memory ที่ใช้จริง), STAT (สถานะ), START (เวลาเริ่ม) และ COMMAND (คำสั่งที่รัน)
คำสั่ง top และ htop — Monitor แบบ Real-time
คำสั่ง top แสดงข้อมูล Process แบบ Real-time อัปเดตทุก 3 วินาที (ปรับได้ด้วย -d) ส่วนบนแสดงสรุปภาพรวมระบบได้แก่ Uptime, จำนวน Process, CPU Usage, Memory Usage และ Swap Usage ส่วนล่างแสดงรายการ Process เรียงตาม CPU Usage
# เปิด top
top
# เปิด top แสดงเฉพาะ user bom
top -u bom
# เปิด top อัปเดตทุก 1 วินาที
top -d 1
# เปิด top แสดง Thread
top -H
Shortcut Key ที่มีประโยชน์ใน top ได้แก่ P เรียงตาม CPU, M เรียงตาม Memory, k Kill Process (พิมพ์ PID แล้วกด Enter), r Renice Process (เปลี่ยน Priority), 1 แสดง CPU แต่ละ Core แยกกันและ q ออกจาก top
htop เป็นเวอร์ชันปรับปรุงของ top ที่มี UI สวยงามกว่ารองรับการเลื่อนขึ้นลงค้นหากรองและ Kill Process ด้วยเมาส์ได้ติดตั้งด้วย apt install htop (Debian/Ubuntu) หรือ dnf install htop (RHEL/Fedora)
คำสั่ง pgrep, pidof และ pstree
pgrep ค้นหา PID จากชื่อ Process หรือเงื่อนไขอื่นๆได้อย่างยืดหยุ่น
# หา PID ของ nginx
pgrep nginx
# หา PID พร้อมแสดงชื่อ Process
pgrep -a nginx
# หา PID ของ Process ที่รันโดย user www-data
pgrep -u www-data
# หา PID ของ Process ที่เปิดมานานกว่า 1 ชั่วโมง
pgrep --older 3600
pidof ค้นหา PID จากชื่อโปรแกรมที่แน่นอน (exact match) ต่างจาก pgrep ที่ใช้ Pattern matching
# หา PID ของ sshd
pidof sshd
# หา PID เดียว (ตัวแรก)
pidof -s sshd
pstree แสดง Process ทั้งหมดในรูปแบบ Tree ทำให้เห็นความสัมพันธ์ Parent-Child ชัดเจน
# แสดง Process Tree ทั้งหมด
pstree
# แสดงพร้อม PID
pstree -p
# แสดง Tree ของ Process เฉพาะ PID 1234
pstree -p 1234
# แสดงพร้อมชื่อ user
pstree -u
/proc Filesystem — อ่านข้อมูล Process โดยตรง
/proc เป็น Virtual Filesystem ที่ Kernel สร้างขึ้นใน RAM ทุก Process จะมีไดเรกทอรี /proc/[PID]/ ที่เก็บข้อมูลครบถ้วนเกี่ยวกับ Process นั้น
| ไฟล์ | ข้อมูลที่เก็บ | ตัวอย่างคำสั่ง |
|---|---|---|
| /proc/[PID]/status | สถานะ, Memory, UID, GID | cat /proc/1234/status |
| /proc/[PID]/cmdline | คำสั่งที่ใช้รัน Process | cat /proc/1234/cmdline |
| /proc/[PID]/environ | Environment Variables | cat /proc/1234/environ | tr '\0' '\n' |
| /proc/[PID]/fd/ | File Descriptors ที่เปิดอยู่ | ls -la /proc/1234/fd/ |
| /proc/[PID]/maps | Memory Mapping | cat /proc/1234/maps |
| /proc/[PID]/cgroup | Cgroup ที่สังกัด | cat /proc/1234/cgroup |
| /proc/[PID]/io | สถิติ I/O Read/Write | cat /proc/1234/io |
| /proc/[PID]/limits | Resource Limits | cat /proc/1234/limits |
การอ่านข้อมูลจาก /proc โดยตรงมีข้อดีคือไม่ต้องพึ่ง External Tool ใดๆและได้ข้อมูลที่อัปเดตล่าสุดจาก Kernel โดยตรงเหมาะสำหรับการเขียน Script หรือ Monitoring Tool
การจัดการ Process — kill, killall, pkill
การหยุด Process บน Linux ทำได้โดยการส่ง Signal ผ่านคำสั่ง kill และตระกูลเดียวกัน
# ส่ง SIGTERM (ปิดอย่างสุภาพ) ให้ PID 1234
kill 1234
# ส่ง SIGKILL (บังคับหยุดทันที) ให้ PID 1234
kill -9 1234
# ส่ง SIGHUP (reload config) ให้ PID 1234
kill -HUP 1234
# Kill ทุก Process ชื่อ nginx
killall nginx
# Kill Process ตามชื่อ Pattern
pkill -f "python manage.py"
# Kill ทุก Process ของ user guest
pkill -u guest
# Kill Process ที่กิน CPU มากกว่า 90%
pkill --signal KILL -f "$(ps aux --sort=-%cpu | awk 'NR==2{print $NF}')"
หลักการสำคัญ: ใช้kill(SIGTERM) ก่อนเสมอเพื่อให้ Process มีโอกาสบันทึกข้อมูลและ Cleanup ทรัพยากรใช้kill -9(SIGKILL) เฉพาะเมื่อ Process ไม่ตอบสนองต่อ SIGTERM เท่านั้น
Linux Signals ทั้งหมดที่ควรรู้
| Signal | หมายเลข | หน้าที่ | จัดการได้? |
|---|---|---|---|
| SIGHUP | 1 | Hangup — ใช้ Reload Config | ได้ |
| SIGINT | 2 | Interrupt — เหมือนกด Ctrl+C | ได้ |
| SIGQUIT | 3 | Quit — ปิดพร้อมสร้าง Core Dump | ได้ |
| SIGKILL | 9 | บังคับหยุดทันที | ไม่ได้ |
| SIGTERM | 15 | ขอให้ปิดอย่างสุภาพ (default) | ได้ |
| SIGSTOP | 19 | หยุดชั่วคราว (Pause) | ไม่ได้ |
| SIGCONT | 18 | ให้ทำงานต่อ (Resume) | ได้ |
| SIGUSR1 | 10 | User-defined Signal 1 | ได้ |
| SIGUSR2 | 12 | User-defined Signal 2 | ได้ |
ดู Signal ทั้งหมดได้ด้วย kill -l บน Linux มี Signal ทั้งหมด 64 ตัวแต่ที่ใช้บ่อยในงาน SysAdmin มีเพียง 5-6 ตัวตามตารางด้านบน
Process States — สถานะต่างๆของ Process
ใน Linux Process มีสถานะหลัก 5 แบบที่แสดงในคอลัมน์ STAT ของคำสั่ง ps
- R (Running) — กำลังทำงานหรือพร้อมทำงานอยู่ใน Run Queue ของ CPU
- S (Sleeping) — หลับรอ Interruptible เช่นรอ I/O, รอข้อมูลจาก Network สามารถปลุกได้ด้วย Signal
- D (Disk Sleep) — หลับรอ Uninterruptible ส่วนใหญ่เป็น I/O Wait ไม่สามารถถูกขัดจังหวะได้แม้แต่ SIGKILL ถ้ามี Process ติดสถานะ D นานผิดปกติอาจเป็นปัญหาของ Storage หรือ NFS
- T (Stopped) — ถูกหยุดชั่วคราวเช่นกด Ctrl+Z หรือถูกส่ง SIGSTOP
- Z (Zombie) — Process ที่ทำงานเสร็จแล้วแต่ Parent ยังไม่ได้อ่านค่า Exit Status ผ่าน wait() ยังคงมี Entry ใน Process Table แต่ไม่ใช้ทรัพยากรใดๆนอกจาก PID
ตัวอักษรเพิ่มเติมที่อาจปรากฏหลัง STAT ได้แก่ < (High Priority), N (Low Priority/Nice), l (Multi-threaded), s (Session Leader) และ + (Foreground Process Group)
Parent-Child Relationship และ Zombie Process
ใน Linux ทุก Process (ยกเว้น PID 1) จะถูกสร้างโดย Process อื่นเกิดเป็นความสัมพันธ์แบบ Parent-Child เมื่อ Process ลูกทำงานเสร็จมันจะส่ง SIGCHLD ให้ Parent แล้วเข้าสู่สถานะ Zombie รอจนกว่า Parent จะเรียก wait() หรือ waitpid() เพื่ออ่าน Exit Status เมื่ออ่านแล้ว Kernel จะลบ Entry ออกจาก Process Table อย่างสมบูรณ์
ปัญหาเกิดขึ้นเมื่อ Parent ไม่เรียก wait() ทำให้ Zombie สะสมแม้ Zombie จะไม่ใช้ CPU หรือ Memory แต่มันใช้ PID ซึ่งมีจำนวนจำกัดหากมี Zombie มากเกินไปอาจทำให้ระบบไม่สามารถสร้าง Process ใหม่ได้
# หา Zombie Process
ps aux | awk '$8=="Z"'
# นับจำนวน Zombie
ps aux | awk '$8=="Z"' | wc -l
# หา Parent ของ Zombie เพื่อแก้ไข
ps -eo pid, ppid, stat, cmd | awk '$3~/Z/'
วิธีแก้ Zombie คือ Kill Parent Process เมื่อ Parent ตาย PID 1 (systemd) จะรับเลี้ยง Zombie เหล่านั้นและเรียก wait() ให้อัตโนมัติ
Namespace และ PID Isolation สำหรับ Container
PID Namespace เป็นฟีเจอร์ของ Linux Kernel ที่ทำให้ Process ใน Namespace ต่างกันมองเห็น PID ต่างกันเป็นเทคโนโลยีพื้นฐานที่ Docker และ Container Runtime ทั้งหมดใช้เมื่อสร้าง Container ใหม่ Process แรกภายใน Container จะเห็นตัวเองเป็น PID 1 แม้ว่าบน Host จะมี PID เป็นตัวเลขอื่น
# ดู PID Namespace ของ Process
ls -la /proc/self/ns/pid
# รัน Process ใน PID Namespace ใหม่
unshare --pid --fork --mount-proc bash
# ภายใน Namespace ใหม่ Process จะเริ่มนับ PID จาก 1
ps aux # จะเห็น PID 1 เป็น bash ที่เพิ่งรัน
การเข้าใจ PID Namespace มีความสำคัญมากสำหรับการ Debug Container เพราะ PID ที่เห็นภายใน Container จะต่างจาก PID บน Host หากต้องการ Kill Process ใน Container จากภายนอกต้องหา PID บน Host ก่อนด้วย docker top <container> หรือ docker inspect
ตัวอย่างการแก้ปัญหาจริง — Process กิน CPU/RAM
สถานการณ์ที่พบบ่อยที่สุดของ SysAdmin คือ Process ที่ใช้ทรัพยากรมากผิดปกติขั้นตอนการวิเคราะห์และแก้ไขมีดังนี้
กรณี CPU สูง 100%
# หา Process ที่กิน CPU สูงสุด
ps aux --sort=-%cpu | head -5
# ดู Thread ของ Process นั้น
ps -eLo pid, tid,%cpu, comm -p 1234 | sort -k3 -rn | head
# ดู Stack Trace ของ Thread
cat /proc/1234/task/5678/stack
# ใช้ strace ดูว่า Process ทำอะไรอยู่
strace -p 1234 -c # สรุป System Call
strace -p 1234 -e trace=network # ดูเฉพาะ Network Call
กรณี RAM เต็ม
# หา Process ที่กิน RAM สูงสุด
ps aux --sort=-%mem | head -10
# ดู Memory Map ละเอียด
pmap -x 1234
# ดูจาก /proc โดยตรง
cat /proc/1234/status | grep -i vm
# ดู OOM Score (ยิ่งสูงยิ่งถูก Kill ก่อน)
cat /proc/1234/oom_score
Best Practices การจัดการ Process
- ใช้ SIGTERM ก่อน SIGKILL เสมอ — ให้ Process มีเวลา Cleanup ข้อมูลปิด Connection และบันทึก Log ก่อนหยุดทำงาน
- ใช้ systemd จัดการ Service — แทนที่จะรัน Process ด้วยมือให้สร้าง systemd Unit File จะได้ Auto-restart, Logging และ Resource Control มาฟรี
- ตั้งค่า Resource Limit ด้วย cgroup — จำกัด CPU และ Memory ที่ Process สามารถใช้ได้เพื่อป้องกันไม่ให้ Process ตัวเดียวทำระบบล่ม
- Monitor อย่างสม่ำเสมอ — ใช้เครื่องมือเช่น Prometheus + node_exporter เก็บข้อมูล Process แบบ Historical เพื่อวิเคราะห์แนวโน้ม
- อย่าละเลย Zombie — ถ้าเจอ Zombie สะสมให้หา Root Cause ที่ Parent Process ไม่ใช่แค่ Kill แล้วปล่อยผ่าน
- ใช้ nice และ ionice — ปรับ Priority ของ Process ที่ไม่เร่งด่วนให้ต่ำลงเพื่อให้ Process สำคัญมีทรัพยากรเพียงพอ
- เข้าใจ OOM Killer — Linux มี Out-of-Memory Killer ที่จะ Kill Process เมื่อ RAM หมดปรับ oom_score_adj เพื่อปกป้อง Process สำคัญเช่น Database
สรุปและ Cheat Sheet คำสั่งที่ใช้บ่อย
PID เป็นแนวคิดพื้นฐานแต่สำคัญมากในระบบ Linux การเข้าใจกลไกของ PID, Process States, Signals และเครื่องมือจัดการ Process จะช่วยให้คุณวิเคราะห์และแก้ปัญหาระบบได้อย่างมีประสิทธิภาพ
| งาน | คำสั่ง |
|---|---|
| ดูทุก Process | ps aux |
| Monitor Real-time | top หรือ htop |
| หา PID จากชื่อ | pgrep nginx |
| ดู Process Tree | pstree -p |
| ปิด Process สุภาพ | kill PID |
| บังคับ Kill | kill -9 PID |
| Reload Config | kill -HUP PID |
| หา Zombie | ps aux | awk '$8=="Z"' |
| ดูข้อมูลจาก Kernel | cat /proc/PID/status |
| ดู File ที่เปิด | ls -la /proc/PID/fd/ |
Q: PID Linux คืออะไร
PID (Process ID) คือหมายเลขประจำตัวที่ Linux Kernel กำหนดให้กับทุก Process ที่ทำงานอยู่ในระบบเป็นตัวเลขจำนวนเต็มบวกที่ไม่ซ้ำกันใช้สำหรับระบุติดตามและจัดการ Process