❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Khi bạn chạy một lệnh trên VPS, hệ điều hành không chỉ “thực thi xong rồi thôi”. Mỗi lệnh, mỗi service, mỗi chương trình đang hoạt động đều tồn tại dưới dạng một process. Hiểu cách xem, theo dõi, và kiểm soát process là kỹ năng quan trọng khi quản trị VPS. Bài này mình sẽ đi qua các công cụ chính: ps, top, htop, kill, cùng một số kỹ thuật nâng cao.

linux b7 process

Process là gì?

Nói đơn giản: mỗi chương trình đang chạy trên Linux là một process. Khi bạn gõ lệnh nginx, hệ thống tạo ra một process. Khi bạn chạy mysql, đó là một process khác. Ngay cả lệnh ls bạn vừa gõ cũng tạo ra một process, chỉ là nó chạy xong rồi tự kết thúc rất nhanh.

Mỗi process được gán một con số gọi là PID (Process ID). PID là duy nhất tại thời điểm process đang chạy, giúp bạn phân biệt và thao tác với đúng process mình cần.

Một vài đặc điểm của process:

  • PID 1 luôn là process đầu tiên khởi động (thường là systemd trên các distro hiện đại).
  • Mỗi process có một parent process (process cha). Ví dụ khi bạn gõ lệnh trong terminal, shell (bash/zsh) là parent, và lệnh đó là child process.
  • Process có thể ở nhiều trạng thái: Running (đang chạy), Sleeping (đang chờ), Stopped (bị dừng), Zombie (đã kết thúc nhưng chưa được dọn).

Bây giờ mình sẽ đi vào các công cụ để làm việc với process.

ps: Xem danh sách process

ps (process status) là lệnh cơ bản nhất để xem process đang chạy. Lệnh này hiển thị “ảnh chụp” tại thời điểm bạn gõ, không cập nhật real-time.

ps aux: Xem tất cả process

ps aux

Output sẽ trông như thế này:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 169512 13296 ?        Ss   Mar10   0:03 /usr/lib/systemd/systemd
root       512  0.0  0.1  89716  8432 ?        Ss   Mar10   0:01 /usr/sbin/sshd -D
www-data  1024  0.2  0.5 145892 42100 ?        S    Mar10   1:25 nginx: worker process
mysql     1156  1.5  5.2 1258432 425680 ?      Sl   Mar10  12:34 /usr/sbin/mysqld
root      2048  0.0  0.0  10072  3456 pts/0    R+   16:30   0:00 ps aux

Giải thích từng cột:

  • USER: Process chạy dưới user nào. Ví dụ www-data cho web server, mysql cho database.
  • PID: Process ID, con số định danh duy nhất.
  • %CPU: Phần trăm CPU mà process đang dùng.
  • %MEM: Phần trăm RAM mà process đang chiếm.
  • VSZ: Virtual memory size (KB). Đây là tổng bộ nhớ ảo mà process yêu cầu, bao gồm cả phần chưa thực sự dùng đến.
  • RSS: Resident Set Size (KB). Bộ nhớ thực tế process đang chiếm trong RAM. Cột này phản ánh chính xác hơn VSZ.
  • TTY: Terminal gắn với process. Dấu ? nghĩa là process chạy nền (daemon), không gắn terminal nào.
  • STAT: Trạng thái process. S = sleeping, R = running, Z = zombie, T = stopped. Ký tự phụ: s = session leader, l = multi-threaded, + = foreground.
  • START: Thời điểm process bắt đầu chạy.
  • TIME: Tổng thời gian CPU mà process đã sử dụng.
  • COMMAND: Lệnh đã khởi chạy process.

Lọc process cụ thể

Danh sách process trên VPS thường rất dài. Để tìm nhanh process cần quan tâm, kết hợp ps với grep:

# Tìm tất cả process liên quan đến nginx
ps aux | grep nginx

Output:

root      1023  0.0  0.1 141112  8540 ?        Ss   Mar10   0:00 nginx: master process
www-data  1024  0.2  0.5 145892 42100 ?        S    Mar10   1:25 nginx: worker process
www-data  1025  0.1  0.4 145640 38200 ?        S    Mar10   1:10 nginx: worker process
root      2055  0.0  0.0   6476   884 pts/0    S+   16:31   0:00 grep --color=auto nginx

Bạn sẽ thấy dòng cuối là chính lệnh grep. Để loại bỏ dòng thừa đó:

ps aux | grep nginx | grep -v grep

Hoặc dùng mẹo ngoặc vuông:

ps aux | grep [n]ginx

ps -ef: Format khác

Ngoài ps aux, bạn sẽ hay gặp ps -ef. Hai lệnh cho kết quả tương tự nhưng format hơi khác:

ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Mar10 ?        00:00:03 /usr/lib/systemd/systemd
root       512     1  0 Mar10 ?        00:00:01 /usr/sbin/sshd -D

Điểm khác biệt đáng chú ý: ps -ef có cột PPID (Parent PID), cho bạn biết process cha là ai. Cái này hữu ích khi cần trace xem process được sinh ra từ đâu.

Mẹo: Dùng ps aux khi cần xem CPU/RAM. Dùng ps -ef khi cần xem quan hệ cha-con giữa các process.

top: Monitor process real-time

Khác với ps chỉ cho ảnh chụp một lần, top hiển thị process và cập nhật liên tục (mặc định mỗi 3 giây). Đây là công cụ có sẵn trên mọi hệ thống Linux, không cần cài thêm gì.

top

Giao diện top trông như thế này:

top - 16:35:01 up 5 days,  3:22,  1 user,  load average: 0.52, 0.38, 0.31
Tasks: 128 total,   1 running, 126 sleeping,   0 stopped,   1 zombie
%Cpu(s):  5.2 us,  1.3 sy,  0.0 ni, 93.1 id,  0.2 wa,  0.0 hi,  0.2 si
MiB Mem :   3956.4 total,    512.8 free,   2105.6 used,   1338.0 buff/cache
MiB Swap:   2048.0 total,   1920.0 free,    128.0 used.   1620.4 avail Mem
PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1156 mysql     20   0 1258432 425680  18964 S   3.0   5.2  12:34.56 mysqld
 1024 www-data  20   0  145892  42100  12580 S   0.7   0.5   1:25.30 nginx

Giải thích phần header:

  • load average: 0.52, 0.38, 0.31: Trung bình số process đang chờ CPU trong 1, 5, 15 phút. Nếu VPS có 2 CPU, load average dưới 2.0 là ổn. Vượt quá số CPU nghĩa là hệ thống đang quá tải.
  • Tasks: Tổng số process và trạng thái. Chú ý con số zombie, nếu lớn hơn 0 thì cần kiểm tra.
  • %Cpu(s): us = user space, sy = system/kernel, id = idle (rảnh), wa = waiting for I/O. Nếu wa cao nghĩa là disk đang chậm.
  • MiB Mem: Bộ nhớ RAM. Đừng lo nếu free thấp vì Linux dùng RAM trống làm buff/cache. Con số thực sự quan trọng là avail Mem, đó mới là RAM còn dùng được.
  • MiB Swap: Swap đang dùng bao nhiêu. Nếu used cao và liên tục tăng, VPS đang thiếu RAM.

Phím tắt trong top

Khi đang ở trong giao diện top, bạn có thể dùng các phím sau:

  • q: Thoát top.
  • P (Shift+p): Sắp xếp theo CPU, process ngốn CPU nhất lên đầu.
  • M (Shift+m): Sắp xếp theo Memory.
  • k: Kill process. Gõ k, nhập PID, chọn signal (mặc định 15 = SIGTERM).
  • 1 (số 1): Hiển thị từng CPU core riêng biệt thay vì gộp chung.
  • c: Hiển thị đầy đủ command line thay vì chỉ tên process.
  • d: Đổi thời gian refresh (mặc định 3 giây).

Mẹo: Nếu chỉ cần xem nhanh rồi thoát, dùng top -b -n 1 để top in ra 1 lần rồi dừng (batch mode). Hữu ích khi bạn muốn pipe output vào file hoặc lệnh khác.

htop: top nhưng dễ dùng hơn

htop là phiên bản nâng cấp của top với giao diện trực quan, có màu sắc, hỗ trợ cuộn bằng chuột, và nhiều tính năng tiện lợi hơn. Tuy nhiên htop không có sẵn, cần cài thêm.

Cài đặt htop

# Ubuntu/Debian
sudo apt install htop
# CentOS/AlmaLinux/Rocky (EPEL có sẵn htop)
sudo dnf install htop

Sau khi cài xong, chạy:

htop

Giao diện htop

So với top khá khô khan, htop cho bạn trải nghiệm khác hẳn:

  • CPU bars: Mỗi CPU core hiển thị dạng thanh ngang với màu sắc. Xanh lá = user, đỏ = kernel, xanh dương = low priority. Nhìn là biết ngay core nào đang bận.
  • Memory bars: Thanh RAM và Swap cũng hiển thị trực quan. Xanh lá = đang dùng, xanh dương = buffer, vàng = cache.
  • Tree view: Hiển thị process dạng cây, thấy rõ quan hệ cha-con. Ví dụ bạn sẽ thấy sshd là cha, bên dưới là các session SSH con.
  • Cuộn được: Dùng mũi tên hoặc chuột để cuộn lên xuống danh sách process, không bị giới hạn như top.

Phím tắt trong htop

  • F5: Bật/tắt tree view. Rất hay để xem process nào sinh ra process nào.
  • F9: Kill process. Chọn process bằng mũi tên, bấm F9, chọn signal rồi Enter.
  • F6: Chọn cột để sắp xếp (CPU%, MEM%, TIME, v.v.).
  • F4: Lọc (filter) process theo tên. Gõ tên process, chỉ hiện những process khớp.
  • F3 hoặc /: Tìm kiếm process.
  • F2: Vào Setup để tùy chỉnh giao diện, thêm/bớt cột hiển thị.
  • t: Bật/tắt tree view (tương tự F5).
  • Space: Đánh dấu (tag) process. Bạn có thể tag nhiều process rồi kill hàng loạt.
  • u: Lọc process theo user cụ thể.

Lưu ý: htop tiện hơn top rất nhiều, nhưng trên một số server tối giản thì chỉ có top. Nên quen dùng cả hai.

kill: Dừng process

Khi cần dừng một process, bạn dùng lệnh kill. Tên nghe “bạo lực” nhưng thực ra kill chỉ là gửi một signal (tín hiệu) đến process. Tùy signal mà process sẽ phản ứng khác nhau.

kill PID: Dừng nhẹ nhàng

# Tìm PID của nginx
ps aux | grep nginx
# Dừng process với PID 1023
kill 1023

Khi gõ kill PID không kèm option gì, nó gửi signal SIGTERM (15). Đây là cách dừng “lịch sự”: process nhận được tín hiệu, tự dọn dẹp (đóng file, lưu data, giải phóng tài nguyên) rồi mới thoát. Hầu hết các service đều xử lý SIGTERM đúng cách.

kill -9: Buộc dừng ngay lập tức

kill -9 1023

Signal SIGKILL (9) là “biện pháp cứng”. Kernel trực tiếp kết thúc process, không cho nó cơ hội dọn dẹp gì. Dùng khi process bị treo cứng, không phản hồi kill thông thường.

Quan trọng: Luôn thử kill PID trước. Chỉ dùng kill -9 khi process thực sự không chịu dừng. Lý do: kill -9 không cho process cơ hội lưu data, có thể gây corrupt file hoặc mất dữ liệu.

killall và pkill: Kill theo tên

Không phải lúc nào bạn cũng muốn tìm PID. Hai lệnh sau cho phép kill theo tên hoặc pattern:

# Kill tất cả process có tên "nginx"
killall nginx

# Kill theo pattern — hữu ích khi tên process dài hoặc có tham số pkill -f "python app.py"

# Kill tất cả process của user www-data pkill -u www-data

Sự khác biệt giữa hai lệnh:

  • killall nginx: Khớp chính xác tên process (cột COMMAND). Nếu process tên là nginx: master process, killall vẫn khớp phần nginx.
  • pkill -f "python app.py": Tìm trong toàn bộ command line (bao gồm cả tham số). Flag -f rất quan trọng, không có nó thì pkill chỉ khớp tên process.

Signals phổ biến

Linux dùng hệ thống signal để giao tiếp với process. Dưới đây là các signal bạn sẽ gặp thường xuyên:

SignalSốÝ nghĩa
SIGTERM15Yêu cầu dừng. Process có thể bắt signal này và tự dọn dẹp trước khi thoát. Đây là signal mặc định khi gõ kill PID.
SIGKILL9Buộc dừng ngay. Kernel xử lý trực tiếp, process không thể bắt hay bỏ qua signal này.
SIGHUP1Hang up. Ban đầu nghĩa là “terminal bị ngắt”. Nhiều service (nginx, Apache) dùng SIGHUP để reload config mà không cần restart.
SIGSTOP19Tạm dừng (pause) process. Process không bị kill, chỉ bị “đóng băng”. Dùng SIGCONT (18) để tiếp tục.
SIGINT2Interrupt. Đây là signal gửi khi bạn bấm Ctrl+C trong terminal.

Ví dụ thực tế:

# Reload config nginx mà không cần restart
kill -1 $(cat /var/run/nginx.pid)
# hoặc
kill -SIGHUP $(pgrep -x nginx | head -1)

# Tạm dừng process kill -SIGSTOP 1234

# Tiếp tục process đã bị tạm dừng kill -SIGCONT 1234

Background và Foreground

Khi SSH vào VPS và chạy một lệnh mất thời gian lâu (backup, compile, download), terminal sẽ bị “treo” cho đến khi lệnh xong. Linux cho phép bạn chạy lệnh ở background để tiếp tục làm việc khác.

Chạy lệnh ở background

# Thêm & ở cuối để chạy background
tar -czf backup.tar.gz /var/www &

# Terminal hiện ra job number và PID [1] 3456

Lệnh sẽ chạy ngầm, bạn có thể tiếp tục gõ lệnh khác.

Quản lý jobs

# Xem danh sách background jobs
jobs

# Output: [1]+ Running tar -czf backup.tar.gz /var/www & [2]- Stopped vim config.txt

# Đưa job 1 về foreground fg %1

# Nếu đang chạy lệnh ở foreground, muốn đẩy về background: # Bấm Ctrl+Z (tạm dừng) rồi gõ: bg %1

Flow thường gặp: Bạn chạy một lệnh, nhận ra nó mất lâu, bấm Ctrl+Z để pause, rồi gõ bg để cho nó chạy tiếp ở background.

nohup: Chạy khi thoát SSH

Có một vấn đề: khi bạn thoát SSH, tất cả process con của session đó sẽ nhận signal SIGHUP và thường bị dừng. Nếu muốn lệnh tiếp tục chạy sau khi thoát SSH:

# nohup = no hangup — bỏ qua SIGHUP
nohup python3 long_task.py &

# Output được ghi vào file nohup.out # Xem output: tail -f nohup.out

Nếu muốn redirect output vào file cụ thể:

nohup python3 long_task.py > /var/log/task.log 2>&1 &

Gợi ý: Với các task chạy lâu, bạn nên dùng screen hoặc tmux thay vì nohup. Hai công cụ này cho phép bạn detach/reattach session, quay lại xem output bất cứ lúc nào. Mình sẽ nói thêm ở bài riêng.

nice và renice: Điều chỉnh độ ưu tiên

Mỗi process trên Linux có một giá trị nice từ -20 đến 19. Giá trị càng thấp thì process được ưu tiên CPU càng cao. Mặc định tất cả process có nice = 0.

  • -20: Ưu tiên cao nhất (ít “nice” nhất, giành CPU nhiều nhất).
  • 19: Ưu tiên thấp nhất (rất “nice”, nhường CPU cho process khác).
  • Chỉ root mới có thể đặt nice âm (tăng ưu tiên). User thường chỉ có thể tăng nice (giảm ưu tiên).

Dùng nice khi khởi chạy

# Chạy backup với ưu tiên thấp — không ảnh hưởng đến web server
nice -n 15 tar -czf backup.tar.gz /var/www

# Chạy task quan trọng với ưu tiên cao (cần root) sudo nice -n -10 /usr/bin/critical-task

Dùng renice cho process đang chạy

# Giảm ưu tiên của process PID 1234
renice 10 -p 1234

# Tăng ưu tiên (cần root) sudo renice -5 -p 1234

# Thay đổi nice cho tất cả process của user mysql sudo renice 5 -u mysql

Ví dụ thực tế: VPS đang chạy web server lẫn backup cùng lúc. Web server cần phản hồi nhanh, backup thì chạy từ từ cũng được. Bạn có thể renice 15 cho process backup để nó nhường CPU cho web server.

Troubleshooting thực tế

Biết lệnh là một chuyện, biết dùng khi nào mới là quan trọng. Dưới đây là vài tình huống thường gặp khi quản trị VPS.

CPU 100%: Tìm thủ phạm

VPS đang chậm, SSH vào cũng lag. Việc đầu tiên cần làm:

# Mở top, sort theo CPU (bấm P)
top

# Hoặc xem nhanh top 5 process ngốn CPU nhất ps aux --sort=-%cpu | head -6

Nhìn vào cột %CPU. Nếu thấy một process chiếm 90-100%, đó là thủ phạm. Các tình huống phổ biến:

  • PHP worker ngốn CPU: Có thể do script chạy vòng lặp vô hạn, hoặc WordPress plugin lỗi. Kiểm tra access log xem request nào đang gọi liên tục.
  • MySQL query nặng: Dùng mysqladmin processlist hoặc SHOW PROCESSLIST; trong MySQL để xem query nào đang chạy.
  • Process lạ: Nếu tên process không quen thuộc, có thể server bị hack và đang chạy crypto miner. Kiểm tra kỹ user và command.

Memory leak: RAM tăng dần

Memory leak là khi một process sử dụng RAM ngày càng tăng mà không giải phóng. Cách phát hiện:

# Sort process theo memory
ps aux --sort=-%mem | head -10

# Xem chi tiết memory của process cụ thể cat /proc/1234/status | grep -i vm

Nếu thấy RSS (bộ nhớ thực) của một process liên tục tăng theo thời gian mà không giảm, đó là dấu hiệu memory leak. Giải pháp tạm thời là restart service đó. Giải pháp lâu dài thì cần fix code hoặc cập nhật phần mềm.

Zombie process: Chết mà chưa được chôn

Zombie process là process đã kết thúc nhưng vẫn còn nằm trong bảng process vì parent process chưa “thu dọn” nó. Zombie không chiếm CPU hay RAM, nhưng chiếm một slot trong bảng process.

# Tìm zombie process
ps aux | awk '$8 ~ /Z/ {print}'

# Hoặc ps -eo pid,ppid,stat,cmd | grep -w Z

Output sẽ có dạng:

nobody   5678  0.0  0.0      0     0 ?        Z    Mar10   0:00 [php-fpm] 

Bạn không thể kill zombie process vì nó đã chết rồi. Cách xử lý là kill parent process (process cha) để init/systemd tiếp quản và dọn dẹp zombie:

# Tìm PPID của zombie
ps -eo pid,ppid,stat,cmd | grep -w Z

# Kill parent process kill

Nếu chỉ có vài zombie thì không sao. Nhưng nếu số lượng zombie tăng liên tục (kiểm tra qua dòng “zombie” trong top), thì parent process đang có vấn đề và cần được xử lý.

Checkpoint: Thực hành

Hãy thử thực hành theo các bước sau trên VPS của bạn:

Bước 1: Tìm process nginx đang chạy và xem PID:

ps aux | grep [n]ginx

Bước 2: Ghi lại PID của master process (dòng có nginx: master process).

Bước 3: Thử dừng nginx bằng kill:

# Dừng nhẹ nhàng
kill 

# Kiểm tra xem nginx đã dừng chưa ps aux | grep [n]ginx

Bước 4: Start nginx lại:

sudo systemctl start nginx

# Kiểm tra lại ps aux | grep [n]ginx

Bước 5: Mở htop, tìm process nginx bằng F4 (filter), quan sát CPU và memory.

Lưu ý: Trên production server, nên dùng systemctl stop/start để quản lý service thay vì kill trực tiếp. Bài tập trên chỉ để bạn hiểu cơ chế. Trong thực tế, kill dùng khi process bị treo và không phản hồi systemctl.

Tổng kết

Bảng tóm tắt nhanh các lệnh trong bài:

LệnhCông dụng
ps auxLiệt kê tất cả process kèm CPU, RAM
ps aux | grep ...Lọc process theo tên
topMonitor process real-time (có sẵn)
htopMonitor real-time với giao diện đẹp (cần cài)
kill PIDGửi SIGTERM, dừng nhẹ nhàng
kill -9 PIDSIGKILL, buộc dừng ngay
killall / pkillKill theo tên hoặc pattern
command &Chạy ở background
nohup command &Chạy kể cả khi thoát SSH
nice / reniceĐiều chỉnh độ ưu tiên CPU

Process management là kiến thức nền tảng khi làm việc với Linux. Khi VPS gặp sự cố về hiệu suất, những lệnh trong bài này sẽ là công cụ đầu tiên bạn cần dùng. Hãy tập sử dụng thường xuyên để quen tay, đặc biệt là htopps aux.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

Trần Thắng

Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI