❤️ 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.

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à
systemdtrê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-datacho web server,mysqlcho 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ếuwacao nghĩa là disk đang chậm. - MiB Mem: Bộ nhớ RAM. Đừng lo nếu
freethấp vì Linux dùng RAM trống làmbuff/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
usedcao 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
sshdlà 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,killallvẫn khớp phầnnginx.pkill -f "python app.py": Tìm trong toàn bộ command line (bao gồm cả tham số). Flag-frất quan trọng, không có nó thìpkillchỉ 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:
Signal Số Ý nghĩa SIGTERM 15 Yê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.SIGKILL 9 Buộc dừng ngay. Kernel xử lý trực tiếp, process không thể bắt hay bỏ qua signal này. SIGHUP 1 Hang 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. SIGSTOP 19 Tạm dừng (pause) process. Process không bị kill, chỉ bị “đóng băng”. Dùng SIGCONT (18) để tiếp tục.SIGINT 2 Interrupt. Đâ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 processlisthoặcSHOW 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ệnh Cô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à htop và ps aux.
Có thể bạn cần xem thêm
- Troubleshooting VPS Linux - Cách xủ lý sự cố VPS phổ biến
- Systemd và quản lý service trên Linux VPS
- Hướng dẫn phân tích, giải thích lệnh TOP trong Linux
- Quản lý file và thư mục trên Linux - Lệnh cơ bản cho VPS
- Quyền file và thư mục trên Linux - chmod, chown và rwx
- Grep, Pipe và Redirect trên Linux - Xử lý text như pro
Về tác giả
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.