Tại sao phải quan tâm đến process?

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. tophtop — 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 CPU
  • M — sắp xếp theo Memory
  • k — kill process (nhập PID)
  • u — lọc theo user
  • 1 — 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. nicerenice — Ư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

lastlastb 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.

Biên Tập Viên
Biên Tập Viên

Tác giả tại Pioneer — nền tảng kiến thức thực chiến về Công nghệ & Tài chính.

Bình luận (0)

Chưa có bình luận nào. Hãy là người đầu tiên!