Mục tiêu chương
Sau khi hoàn thành chương này, bạn sẽ có thể:
Liệt kê tiến trình
Sử dụng lệnh ps và top để xem tất cả tiến trình đang chạy, bao gồm PID, CPU, bộ nhớ và trạng thái.
Foreground & Background
Chuyển tiến trình giữa foreground và background bằng fg, bg, jobs.
Kill tiến trình
Gửi tín hiệu đến tiến trình bằng kill và killall; hiểu SIGTERM, SIGKILL, SIGHUP.
Ưu tiên CPU (nice/renice)
Điều chỉnh mức ưu tiên CPU của tiến trình từ -20 đến 19 bằng lệnh nice và renice.
Giám sát đồ họa
Dùng GNOME System Monitor để xem, tạm dừng, kill hoặc renice tiến trình qua GUI.
Cgroups v2
Hiểu cơ chế cgroups v2 để giới hạn tài nguyên (CPU, RAM, IO) cho nhóm tiến trình — nền tảng của containers và cloud.
Lý thuyết chi tiết
Các khái niệm và lệnh quan trọng trong chương 6
Lệnh ps — Xem tiến trình
Lệnh ps liệt kê các tiến trình đang chạy. Mỗi tiến trình có PID duy nhất. Cột STAT: R (running), S (sleeping), s (session leader). VSZ = bộ nhớ ảo cấp phát; RSS = bộ nhớ vật lý đang dùng thực sự.
$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT TIME COMMAND
jake 1234 0.0 0.1 12345 2048 pts/2 Ss 0:00 bash
jake 5678 0.0 0.0 9876 956 pts/2 R+ 0:00 ps u
$ ps aux | less
# Xem tat ca tien trinh moi user
$ ps -eo pid,user,group,vsz,rss,comm --sort=-vsz | head
PID USER GROUP VSZ RSS COMMAND
5219 chris chris 12763828 572024 firefox
3841 chris chris 4768392 298668 gnome-shell
Lệnh top — Giám sát thời gian thực
Lệnh top hiển thị tiến trình theo thời gian thực, tự động cập nhật mỗi 5 giây. Phần đầu: uptime, users, load average, CPU, RAM, swap. Phần dưới: danh sách tiến trình sắp xếp theo %CPU.
Phím tắt trong top
- h — Help
- M — Sort theo RAM
- P — Sort theo CPU
- 1 — Hiển từng CPU core
- R — Đảo chiều sort
- u — Lọc theo user
- k — Kill tiến trình
- r — Renice tiến trình
- q — Thoát
$ top
top - 10:25 up 2:15, 2 users, load: 0.15
Tasks: 185 total, 1 running, 184 sleeping
%Cpu(s): 2.3us, 0.7sy, 96.8id
MiB Mem: 15933 total, 9234 free
PID USER PR NI VIRT RES %CPU COMMAND
5219 chris 20 0 12.7g 572m 8.3 firefox
Background và Foreground Processes
Bash cho phép chạy nhiều chương trình đồng thời. Thêm & để chạy background. Ctrl+Z tạm dừng tiến trình. fg %n đưa về foreground, bg %n tiếp tục background.
$ find /usr > /tmp/allusrfiles &
[3] 15971
$ jobs
[1] Stopped vi /tmp/myfile
[2] Running find /usr > /tmp/allusrfiles &
[3]+ Running nroff -man /usr/man2/* > /tmp/man2 &
$ fg %1
# Dua job 1 ve foreground
$ bg %5
[5] Running nroff -man /usr/man4/* > /tmp/man4 &
Tín hiệu (Signals) — kill và killall
Lệnh kill gửi tín hiệu theo PID; killall gửi theo tên lệnh. Mặc định cả hai dùng SIGTERM (15). SIGKILL (9) và SIGSTOP không thể bị chặn.
| Tín hiệu | Số | Mô tả |
|---|---|---|
| SIGHUP | 1 | Reload config (hang up) |
| SIGINT | 2 | Interrupt từ keyboard (Ctrl+C) |
| SIGKILL | 9 | Kill ngay lập tức, không thể chặn |
| SIGTERM | 15 | Kết thúc sạch (mặc định) |
| SIGSTOP | 17/19/23 | Dừng tiến trình |
| SIGCONT | 19/18/25 | Tiếp tục tiến trình đã dừng |
$ kill 10432
# Gui SIGTERM (15) den PID 10432
$ kill -9 10432
# Gui SIGKILL - buoc ket thuc ngay
$ kill -SIGKILL 10432
# Tuong duong kill -9
$ killall -9 testme
# Kill tat ca tien trinh ten 'testme'
$ killall -HUP gnome-shell
# Reload gnome-shell (doc lai config)
Ưu tiên CPU với nice và renice
Mỗi tiến trình có giá trị nice từ -20 (ưu tiên cao nhất) đến 19 (ưu tiên thấp nhất), mặc định 0. User thường chỉ được đặt 0 đến 19. Root có thể đặt giá trị âm. Dùng nice khi khởi động, renice khi đang chạy.
# nice -n +5 updatedb &
# Chay updatedb background voi nice=5
$ ps -o pid,ni,comm -p 20284
PID NI COMMAND
20284 5 updatedb
# renice -n -5 20284
20284 (process ID) old priority 5, new priority -5
# Chi root moi duoc dat gia tri am
Cgroups v2 — Giới hạn tài nguyên nhóm
Control Groups (cgroups) giới hạn và theo dõi tài nguyên cho nhóm tiến trình. Cgroups v2 là mặc định trên Ubuntu, Fedora, RHEL. Đây là nền tảng của containers (Docker, Podman) và cloud computing. Khác với nice, cgroups áp dụng cho toàn bộ nhóm tiến trình bao gồm cả child processes.
CPU Controller
Kiểm soát phân phối CPU cycles giữa các nhóm tiến trình.
Memory Controller
Giới hạn và theo dõi mức sử dụng bộ nhớ RAM.
IO Controller
Kiểm soát truy cập đến thiết bị lưu trữ block devices.
Bài Lab Thực Hành
Thực hành quản lý tiến trình Linux step by step
Xem tiến trình với ps
Liệt kê toàn bộ tiến trình, sắp xếp theo bộ nhớ sử dụng nhiều nhất.
$ ps aux | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT TIME COMMAND
root 1 0.0 0.2 187660 13296 ? Ss 0:02 systemd
$ ps -eo pid,user,group,vsz,rss,comm --sort=-vsz | head -5
PID USER GROUP VSZ RSS COMMAND
5219 chris chris 12763828 572024 firefox
Giám sát với top
Mở top, thực hành phím tắt M (sort RAM), P (sort CPU), u (filter user), q (thoát).
$ top
top - 10:25:30 up 2:15, 2 users, load: 0.15 0.12 0.10
Tasks: 185 total, 1 running, 184 sleeping
%Cpu(s): 2.3us, 0.7sy, 96.8id
MiB Mem: 15933 total, 9234 free, 4201 used
# Nhan M de sort theo RAM, P theo CPU, q thoat
Chạy tiến trình background và quản lý jobs
Khởi động nhiều lệnh background và dùng fg/bg để điều khiển.
$ sleep 300 &
[1] 23456
$ sleep 200 &
[2] 23457
$ jobs
[1]- Running sleep 300 &
[2]+ Running sleep 200 &
$ fg %1
# Ctrl+Z de dung, bg %1 de tiep tuc background
Gửi tín hiệu và kill tiến trình
Tìm PID của gedit và gửi các tín hiệu: SIGSTOP, SIGCONT, SIGTERM.
$ gedit &
[1] 24680
$ kill -SIGSTOP 24680
# gedit bi pause (frozen)
$ kill -SIGCONT 24680
# gedit tiep tuc hoat dong
$ kill -15 24680
# Ket thuc gedit sach se
Sử dụng killall để kill theo tên
Chạy nhiều tiến trình xeyes và kill tất cả cùng lúc bằng killall.
$ for i in $(seq 1 5); do xeyes &; done
[1] 30001
[2] 30002
...5 xeyes windows open...
$ killall xeyes
[1] Terminated xeyes
[2] Terminated xeyes
# Tat ca xeyes bi dong
Đặt và thay đổi nice value
Chạy lệnh với nice value, kiểm tra, rồi thay đổi bằng renice.
$ nice -n 5 gedit &
[1] 25000
$ ps -o pid,ni,comm -p 25000
PID NI COMMAND
25000 5 gedit
$ renice -n 7 25000
25000 (process ID) old priority 5, new priority 7
Câu hỏi Ôn tập
Kiểm tra kiến thức chương 6
Lệnh nào hiển thị tất cả tiến trình của tất cả user kèm %CPU, %MEM?
$ ps aux
Cờ a=tất cả user, u=user-oriented format (có %CPU, %MEM), x=kể cả không có terminal.
Sự khác biệt giữa SIGTERM (15) và SIGKILL (9)?
SIGTERM yêu cầu tiến trình tự dọn dẹp rồi thoát — có thể bị bỏ qua. SIGKILL buộc kernel kill ngay lập tức — không thể chặn hay bỏ qua.
Tại sao nice=-20 có ưu tiên cao hơn nice=19?
Nice thể hiện mức "nhường nhịn" cho tiến trình khác. Nice cao (19) = nhường nhiều = ưu tiên thấp. Nice âm (-20) = ít nhường = ưu tiên cao, CPU phục vụ nhiều hơn.
Kill tất cả tiến trình cùng tên mà không cần biết PID?
$ killall -9 firefox
killall kill theo tên. Cẩn thận: killall bash sẽ đóng tất cả shell sessions!
Phân biệt VSZ và RSS trong output của ps?
VSZ = tổng bộ nhớ ảo cấp phát (kể cả phần chưa dùng, swap, shared libs). RSS = bộ nhớ vật lý đang dùng thực sự, không thể swap. RSS thường nhỏ hơn VSZ.
Cgroups v2 khác nice ở điểm nào?
nice chỉ ảnh hưởng CPU một tiến trình đơn lẻ. Cgroups v2 giới hạn toàn bộ nhóm tiến trình (kể cả child processes) trên nhiều loại tài nguyên: CPU, RAM, IO — nền tảng containers & cloud.
Lệnh nào hiển thị 10 tiến trình dùng CPU nhiều nhất?
$ ps aux --sort=-%cpu | head -11
Trong top nhấn phím P để sort theo CPU. Dấu - trong --sort=-%cpu là giảm dần.
SIGHUP thường dùng để làm gì với daemon?
SIGHUP (1) yêu cầu daemon reload cấu hình mà không restart. Ví dụ: kill -1 $(pidof nginx) để nginx đọc lại nginx.conf không ngắt kết nối client.
Tại sao user thường không thể giảm nice value (tăng ưu tiên)?
Bảo mật hệ thống: nếu user thường có thể tăng ưu tiên CPU, họ có thể chiếm gần hết CPU, ảnh hưởng user khác và hệ thống. Chỉ root được đặt niết âm (tăng ưu tiên cao hơn mặc định).