Tại sao phải quan tâm đến process?
Mỗi lần bạn chạy một lệnh, khởi động một dịch vụ, hay mở terminal — Linux tạo ra một process. Process là đơn vị thực thi cơ bản của hệ điều hành: nó có PID (Pro
Tại sao phải quan tâm đến process?
Mỗi lần bạn chạy một lệnh, khởi động một dịch vụ, hay mở terminal — Linux tạo ra một process. Process là đơn vị thực thi cơ bản của hệ điều hành: nó có PID (Process ID) riêng, bộ nhớ riêng, quyền truy cập tài nguyên riêng.
Với DevSecOps, việc hiểu process không chỉ để troubleshoot khi server chậm. Nó còn là kỹ năng cốt lõi của incident response: khi hệ thống bị xâm nhập, kẻ tấn công thường để lại dấu vết qua các process bất thường — reverse shell, cryptominer, hay backdoor ẩn mình sau tên tiến trình trông vô hại.
Bài này sẽ đi từ nền tảng (process là gì, trạng thái, vòng đời) đến thực chiến (detect anomaly, monitor resource, trace system call).
1. Process là gì? Vòng đời cơ bản
Khi kernel chạy một chương trình, nó tạo ra một process với các thuộc tính:
- PID: định danh duy nhất
- PPID: PID của process cha (parent)
- UID/GID: người dùng và nhóm sở hữu process
- State: trạng thái hiện tại (running, sleeping, zombie…)
- File descriptors: các file đang mở
- Memory map: vùng bộ nhớ được cấp phát
Trạng thái của process
| Ký hiệu | Trạng thái | Ý nghĩa |
|---|---|---|
| R | Running | Đang thực thi hoặc trong run queue |
| S | Sleeping | Đang chờ sự kiện (interruptible) |
| D | Uninterruptible sleep | Chờ I/O, không thể kill — nguy hiểm nếu kéo dài |
| T | Stopped | Bị tạm dừng bởi signal (Ctrl+Z) |
| Z | Zombie | Đã kết thúc nhưng chưa được parent “gom” lại |
SecOps note: Trạng thái D kéo dài bất thường thường chỉ ra vấn đề I/O nghiêm trọng — có thể do ransomware đang encrypt disk, hoặc NFS mount bị treo.
Zombie vs Orphan process
Zombie process: process đã chết nhưng entry trong process table vẫn còn vì parent chưa gọi wait(). Nhìn thấy trạng thái Z trong ps. Thường không nguy hiểm nhưng nếu nhiều zombie → có thể là dấu hiệu parent process bị lỗi.
Orphan process: process cha chết trước con. Kernel tự động reparent chúng về PID 1 (init/systemd). Bình thường, không đáng lo.
2. ps — Snapshot tức thời
ps là lệnh xem danh sách process đang chạy tại một thời điểm. Không real-time, chỉ là snapshot.
# Xem tất cả process, format đầy đủ
ps aux
# Xem dạng cây (process hierarchy)
ps auxf
# Tìm process theo tên
ps aux | grep nginx
# Hiển thị cột cụ thể: PID, PPID, USER, command
ps -eo pid,ppid,user,cmd --sort=-%cpu | head -20
Giải mã output của ps aux:
| Cột | Ý nghĩa |
|---|---|
| USER | Owner của process |
| PID | Process ID |
| %CPU | CPU usage tính từ lúc khởi động process |
| %MEM | Phần trăm RAM vật lý đang dùng |
| VSZ | Virtual memory size (KB) |
| RSS | Resident Set Size — RAM thực sự đang chiếm (KB) |
| STAT | Trạng thái process |
| START | Thời điểm khởi động |
| COMMAND | Lệnh đầy đủ |
SecOps tip: Kẻ tấn công hay đặt tên process giống tiến trình hợp lệ nhưng chạy từ path lạ. Kiểm tra:
# Path thực sự của process (không chỉ tên)
ps aux | awk '{print $11}' | sort -u
# So sánh — /usr/sbin/sshd hợp lệ, còn /tmp/.hidden/sshd thì không
3. top và htop — Monitoring real-time
top
top có sẵn trên mọi Linux, hiển thị real-time. Phần header chứa nhiều thông tin quan trọng:
top - 14:32:01 up 42 days, 3:17, 2 users, load average: 0.52, 0.48, 0.45
Tasks: 214 total, 1 running, 213 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 1.3 sy, 0.0 ni, 92.8 id, 0.5 wa, 0.0 hi, 0.2 si
MiB Mem : 15886.5 total, 4231.2 free, 8742.1 used, 2913.2 buff/cache
MiB Swap: 2048.0 total, 1987.6 free, 60.4 used. 6802.4 avail Mem
Đọc load average: ba con số là trung bình 1 phút, 5 phút, 15 phút. Nếu load average > số CPU core — hệ thống đang quá tải. Nếu load tăng đột ngột trong khi không có workload mới → dấu hiệu đáng điều tra.
Phím tắt hữu ích trong top:
P— sắp xếp theo CPUM— sắp xếp theo Memoryk— kill process (nhập PID)u— lọc theo user1— xem từng CPU core riêng lẻ
htop
htop cần cài thêm (apt install htop) nhưng giao diện trực quan hơn nhiều: màu sắc, cây tiến trình, dễ dùng chuột. Dùng F9 để send signal, F5 để xem dạng cây.
sudo apt install htop # Ubuntu/Debian
sudo dnf install htop # Rocky/RHEL
4. Signals — Giao tiếp với process
Signal là cơ chế kernel dùng để thông báo cho process. Phổ biến nhất:
| Signal | Số | Ý nghĩa |
|---|---|---|
| SIGHUP | 1 | Reload config (không restart) |
| SIGINT | 2 | Interrupt (Ctrl+C) |
| SIGTERM | 15 | Yêu cầu thoát gracefully — mặc định của kill |
| SIGKILL | 9 | Buộc kill ngay, không thể block hay ignore |
| SIGSTOP | 19 | Pause process (không thể block) |
# Gửi SIGTERM (graceful shutdown)
kill 1234
kill -15 1234
# Buộc kill khi process không phản hồi
kill -9 1234
# Kill theo tên
killall nginx
pkill -f "python app.py"
# Reload config nginx (dùng SIGHUP)
kill -HUP $(cat /var/run/nginx.pid)
Best practice: Luôn thử SIGTERM trước. SIGKILL là lựa chọn cuối cùng — nó không cho process dọn dẹp, có thể gây data corruption hoặc bỏ qua cleanup routine quan trọng.
5. nice và renice — Ưu tiên process
Linux scheduler phân bổ CPU dựa trên priority. nice value dao động từ -20 (ưu tiên cao nhất) đến 19 (ưu tiên thấp nhất). Mặc định là 0.
# Chạy process với nice thấp (ít ăn CPU)
nice -n 10 ./heavy-script.sh
# Thay đổi priority của process đang chạy
renice -n 5 -p 1234
# Chỉ root mới có thể set nice âm (tăng priority)
sudo renice -n -5 -p 1234
Dùng nice khi chạy backup, compression hay các job nặng trong giờ cao điểm — tránh ảnh hưởng đến dịch vụ production.
6. /proc filesystem — Nhìn vào não hệ thống
/proc là virtual filesystem — không chiếm disk thực, tồn tại trong RAM. Kernel expose thông tin nội bộ qua đây.
# Thông tin process PID 1234
ls /proc/1234/
# Lệnh đầy đủ (bao gồm argument)
cat /proc/1234/cmdline | tr '' ' '
# File đang mở
cat /proc/1234/fd/
# Memory maps
cat /proc/1234/maps
# Môi trường biến của process
cat /proc/1234/environ | tr '' 'n'
Một số file system-wide quan trọng trong /proc:
/proc/cpuinfo— thông tin CPU/proc/meminfo— thông tin RAM chi tiết/proc/net/tcp— connections TCP hiện tại (raw format)/proc/sys/— kernel parameters có thể điều chỉnh qua sysctl/proc/loadavg— load average hiện tại
SecOps application: Khi cần forensics một process đáng ngờ:
PID=1337
# Lệnh gốc (quan trọng — kẻ tấn công có thể rename process nhưng cmdline không đổi)
cat /proc/$PID/cmdline | tr '' ' '
# Executable thực sự trỏ về đâu?
ls -la /proc/$PID/exe
# Network connections của process này
cat /proc/$PID/net/tcp
# Biến môi trường (có thể chứa API key, credential bị leak)
cat /proc/$PID/environ | tr '' 'n'
7. Resource monitoring — free, vmstat, iostat
free — Memory
free -h
total used free shared buff/cache available
Mem: 15Gi 8.5Gi 4.2Gi 512Mi 2.8Gi 6.8Gi
Swap: 2.0Gi 60Mi 1.9Gi
Cột available quan trọng hơn free — nó bao gồm cả buff/cache có thể giải phóng ngay khi cần. Nếu available xuống gần 0 và swap đang dùng nhiều → hệ thống đang thrashing, performance tụt nghiêm trọng.
vmstat — Virtual Memory & I/O
# Xem mỗi 2 giây, 5 lần
vmstat 2 5
Chú ý cột wa (I/O wait) — nếu cao liên tục → disk I/O là bottleneck. Cột si/so (swap in/out) tăng → dấu hiệu thiếu RAM.
iostat — Disk I/O
sudo apt install sysstat
iostat -x 2 5
Chỉ số %util gần 100% nghĩa là disk đang bão hòa. await cao (> vài chục ms với SSD) → latency I/O bất thường.
8. lsof — List Open Files
Mọi thứ trong Linux đều là file — kể cả socket mạng. lsof cho bạn thấy file nào đang mở bởi process nào.
# File đang mở bởi process có PID 1234
lsof -p 1234
# Process đang mở file/directory cụ thể
lsof /var/log/syslog
# Network connections (thay thế netstat trên nhiều distro mới)
lsof -i
# Connections đến port 80
lsof -i :80
# Connections của user cụ thể
lsof -u www-data
# File đã bị xóa nhưng vẫn đang được giữ mở (chiếm disk)
lsof | grep deleted
SecOps use case: Tìm process đang listen trên port lạ:
lsof -i -P -n | grep LISTEN
# -P: hiển thị số port thay vì service name
# -n: không resolve hostname (nhanh hơn)
9. strace — Theo dõi system calls
strace trace mọi system call mà process thực hiện — đọc file, gọi mạng, cấp phát memory… Đây là công cụ debug và forensics cực kỳ mạnh.
# Trace process đang chạy
strace -p 1234
# Trace lệnh mới
strace ls /tmp
# Chỉ trace system calls cụ thể
strace -e openat,read,write cat /etc/passwd
# Tóm tắt (đếm số lần gọi)
strace -c ls /tmp
# Trace cả child processes
strace -f -p 1234
# Lưu output ra file (thường rất nhiều)
strace -p 1234 -o /tmp/trace.log
SecOps application: Nếu nghi ngờ process đang đọc file nhạy cảm hay gửi data ra ngoài:
# Xem process có đọc file gì
strace -e openat,open -p $SUSPICIOUS_PID 2>&1 | grep -v "ENOENT"
# Xem network syscalls
strace -e connect,sendto,recvfrom -p $SUSPICIOUS_PID
Lưu ý: strace làm chậm process đáng kể — không dùng trên production traffic cao, chỉ dùng khi debug hoặc incident investigation.
10. uptime và who — Quick sanity check
# Thời gian chạy và load average
uptime
# Ai đang logged in
who
w
# Last login history
last
last -n 20 # 20 dòng gần nhất
# Failed login attempts
sudo lastb
last và lastb là hai lệnh đầu tiên nên chạy khi điều tra xâm nhập — xem có login bất thường từ IP lạ hay giờ lạ không.
Tổng kết
Process monitoring là kỹ năng nền tảng của cả sysadmin lẫn security engineer. Nắm được vài điểm cốt lõi:
- ps aux / htop: snapshot và real-time view của mọi process
- Signals: SIGTERM trước, SIGKILL chỉ khi cần thiết
- /proc/[pid]/: nguồn thông tin chi tiết nhất về bất kỳ process nào
- lsof: file và network socket đang mở
- strace: vũ khí cuối cùng khi cần biết process thực sự đang làm gì
Với DevSecOps, bộ kỹ năng này trực tiếp phục vụ incident response: phát hiện cryptominer, reverse shell, hay malware ẩn náu trong hệ thống. Đây không phải lý thuyết — đây là thứ bạn cần khi 3 giờ sáng nhận alert và phải tìm ra kẻ xâm nhập trong 15 phút.
Bài tiếp theo: Networking cơ bản — chúng ta sẽ nói về cách kiểm tra, cấu hình và bảo vệ kết nối mạng trên Linux, từ ip, ss, đến SSH hardening và tcpdump để bắt gói tin ngay trên server.
Bình luận (0)
Vui lòng đăng nhập để tham gia thảo luận.
Đăng nhập ngayChưa có bình luận nào. Hãy là người đầu tiên!