Bạn đã bao giờ rơi vào tình huống một tiến trình chạy ngầm bỗng nhiên "ngốn" sạch tài nguyên CPU, khiến chiếc VPS của bạn trở nên chậm chạp đến mức không thể thao tác được chưa nhỉ? Lúc này, việc hiểu rõ ps Linux là gì sẽ trở thành "cứu cánh" giúp bạn kiểm soát mọi thứ. Thực tế, với tư cách là một Senior System Admin, mình thường xuyên phải sử dụng lệnh ps để rà soát nhanh các tiến trình đang chiếm dụng bộ nhớ cao nhằm đưa ra quyết định xử lý kịp thời. Tất nhiên, việc nắm vững cách dùng ps không chỉ giúp bạn quan sát hệ thống một cách trực quan mà còn là kỹ năng nền tảng để quản trị server chuyên nghiệp. Trong bài viết này, chúng ta sẽ cùng nhau khám phá cách dùng ps một cách chi tiết nhất, từ đó giúp bạn biết cách kiểm tra tiến trình hệ thống một cách vô cùng hiệu quả và nhanh chóng, đúng không nào?
Cần chuẩn bị gì trước khi dùng lệnh ps?
- Quyền người dùng: Có thể sử dụng với tư cách user thường để xem các tiến trình của chính mình hoặc sử dụng quyền sudo để xem toàn bộ tiến trình của tất cả người dùng trong hệ thống.
- Hệ điều hành hỗ trợ: Hoạt động trên hầu hết các bản phân phối Linux (Ubuntu, Debian, CentOS, RHEL, Fedora...) và các hệ điều hành chuẩn POSIX như macOS.
- Gói phần mềm: Lệnh ps thường được cài đặt sẵn trong gói procps hoặc procps-ng trên hầu hết các hệ thống Linux. Nếu chưa có, có thể cài đặt qua lệnh:
Cú pháp lệnh ps là gì?
Lệnh ps hỗ trợ nhiều dạng cú pháp khác nhau tùy thuộc vào các tùy chọn được sử dụng trên các hệ thống Linux/Unix.
ps [OPTIONS] ps [-options] ps [BSD-style options] ps [UNIX/POSIX options]
Các tùy chọn của lệnh ps là gì?
Lệnh ps hỗ trợ ba nhóm tùy chọn chính: hiển thị tiến trình theo phạm vi, định dạng đầu ra, và lọc theo điều kiện cụ thể.
| Tùy chọn ngắn | Tùy chọn dài | Mô tả |
|---|---|---|
| -A | --all | ps -A hiển thị tất cả các tiến trình đang chạy trên hệ thống. |
| -a | ps -a hiển thị tất cả tiến trình ngoại trừ session leader và tiến trình không gắn với terminal. | |
| -e | ps -e hiển thị mọi tiến trình, tương đương với -A. | |
| -f | ps -f xuất đầu ra dạng full-format, bao gồm UID, PID, PPID, thời gian khởi động và lệnh đầy đủ. | |
| -l | ps -l xuất đầu ra dạng long-format, bổ sung thêm các cột như F, S, PRI, NI, ADDR, SZ, WCHAN. | |
| -u | --user | ps -u [user] hiển thị các tiến trình thuộc về người dùng được chỉ định. |
| -U | --User | ps -U [user] lọc tiến trình theo real user ID hoặc tên người dùng thực sự. |
| -p | --pid | ps -p [pid] hiển thị thông tin của tiến trình có PID được chỉ định. |
| -g | --group | ps -g [group] lọc tiến trình theo session hoặc effective group ID. |
| -G | --Group | ps -G [group] lọc tiến trình theo real group ID hoặc tên nhóm thực sự. |
| -t | --tty | ps -t [tty] hiển thị các tiến trình gắn với terminal được chỉ định. |
| -s | --sid | ps -s [sid] lọc tiến trình theo session ID. |
| -o | --format | ps -o [format] cho phép tùy chỉnh các cột hiển thị theo danh sách trường do người dùng định nghĩa. |
| -O | ps -O [format] tương tự -o nhưng giữ lại các cột mặc định và bổ sung thêm trường chỉ định. | |
| -H | ps -H hiển thị các tiến trình theo dạng cây phân cấp (process hierarchy). | |
| -j | ps -j xuất đầu ra theo định dạng jobs, hiển thị PID, PGID, SID và TTY. | |
| -x | ps -x bao gồm cả các tiến trình không gắn với terminal nào (daemon). | |
| -r | ps -r chỉ hiển thị các tiến trình đang ở trạng thái running. | |
| -T | ps -T hiển thị tất cả các tiến trình gắn với terminal hiện tại đang dùng. | |
| -M | ps -M thêm một cột hiển thị nhãn bảo mật SELinux của mỗi tiến trình. | |
| -w | --wide | ps -w mở rộng độ rộng đầu ra, tránh cắt bớt tên lệnh dài. Dùng hai lần (-ww) để không giới hạn độ rộng. |
| -n | --numeric-sort | ps -n hiển thị thông tin người dùng và nhóm dưới dạng số thay vì tên. |
| --sort | ps --sort [key] sắp xếp đầu ra theo trường được chỉ định, ví dụ --sort=-pcpu để sắp xếp theo CPU giảm dần. | |
| --headers | ps --headers lặp lại dòng tiêu đề cột trên mỗi trang của đầu ra. | |
| --no-headers | ps --no-headers ẩn hoàn toàn dòng tiêu đề cột trong đầu ra. | |
| --deselect | ps --deselect đảo ngược điều kiện lọc, hiển thị tất cả tiến trình ngoại trừ những tiến trình thỏa điều kiện đã chỉ định. | |
| --version | ps --version hiển thị thông tin phiên bản của lệnh ps đang được cài đặt. | |
| --help | ps --help hiển thị tóm tắt các tùy chọn và cú pháp sử dụng của lệnh ps. |
xem thêm: System Monitoring and Management
Lệnh ps được sử dụng như thế nào trong thực tế?
Phần dưới đây trình bày các kịch bản kiểm tra tiến trình phổ biến mà quản trị viên hệ thống thường xuyên thực hiện.
ps là gì? [Hiển thị các tiến trình hiện tại]
$ ps PID TTY TIME CMD 1234 pts/0 00:00:00 bash 5678 pts/0 00:00:00 ps
Lệnh hiển thị danh sách các tiến trình đang chạy trong session terminal hiện tại. Đây là cách kiểm tra nhanh nhất để xác nhận sự tồn tại của một shell đang hoạt động.
ps aux là gì? [Xem toàn bộ tiến trình hệ thống]
$ ps aux | head -n 5 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 168312 12344 ? Ss Oct25 0:04 /sbin/init ```
Lệnh liệt kê chi tiết tất cả các tiến trình từ mọi người dùng trên toàn hệ thống. Trong thực tế, đây là lệnh tiêu chuẩn để sysadmin rà soát tài nguyên hệ thống khi máy chủ có dấu hiệu chậm hoặc treo.
ps -ef là gì? [Tìm kiếm tiến trình theo tên]
$ ps -ef | grep nginx root 1234 1 0 10:00 ? 00:00:00 nginx: master process www-data 1235 1234 0 10:00 ? 00:00:00 nginx: worker process
Lệnh kết hợp với grep giúp lọc ra các tiến trình cụ thể dựa trên tên hoặc tham số dòng lệnh. Trên môi trường production, kỹ thuật này được dùng để xác nhận dịch vụ (như Nginx, MySQL) đã khởi chạy đúng cấu hình hay chưa.
ps -eo là gì? [Trích xuất thông tin tùy chỉnh]
$ ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | head -n 3 PID USER %CPU %MEM COMMAND 5678 root 15.5 2.4 python3 1234 user 5.2 1.1 bash
Lệnh cho phép định nghĩa các cột thông tin cần lấy và sắp xếp theo tiêu chí mong muốn. Đây là phương pháp tối ưu để viết script automation nhằm giám sát các tiến trình chiếm dụng CPU hoặc RAM cao nhất.
Lệnh ps không hiển thị đủ thông tin tiến trình hoặc báo lỗi gì?
Trong quá trình quản trị hệ thống, người dùng thường gặp các vấn đề liên quan đến việc thiếu quyền truy cập hoặc sai cú pháp khi sử dụng lệnh ps để kiểm tra tiến trình.
Không hiển thị được các tiến trình của người dùng khác
$ ps PID TTY TIME CMD 1234 pts/0 00:00:00 bash 5678 pts/0 00:00:00 ps
Kết quả trên chỉ hiển thị các tiến trình thuộc quyền sở hữu của người dùng hiện tại, không bao gồm các tiến trình hệ thống hoặc của người dùng khác.
Lỗi cú pháp khi sử dụng các tùy chọn không hợp lệ
$ ps -x -z ps: invalid option -- 'z'
Lệnh sẽ trả về thông báo lỗi nếu người dùng nhập sai hoặc sử dụng các tham số không được hỗ trợ bởi phiên bản ps đang cài đặt trên hệ thống.
Không tìm thấy tiến trình theo tên chính xác
$ ps -ef | grep non_existent_process $ grep: non_existent_process: No such file or directory
Trường hợp này xảy ra khi kết hợp lệnh ps với grep nhưng tham số truyền vào không tồn tại, dẫn đến việc grep cố gắng tìm kiếm một file thay vì một chuỗi văn bản.
Tiến trình đang chạy nhưng không xuất hiện trong danh sách mặc định
$ ps PID TTY TIME CMD 1234 pts/0 00:00:00 bash
Các tiến trình chạy ngầm (daemon) thường không hiển thị khi chỉ sử dụng lệnh ps cơ bản mà không có các tùy chọn bổ sung như -e hoặc -A.
Quy trình thực tế dùng ps trong quản trị hệ thống Linux?
Trong kịch bản xử lý sự cố hiệu năng server, lệnh ps đóng vai trò là một bước quan trọng trong chuỗi thao tác kiểm tra và xử lý tiến trình đang chiếm dụng tài nguyên.
Bước 1: Kiểm tra các tiến trình đang tiêu thụ tài nguyên cao
ps aux --sort=-%cpu | head -n 5
Lệnh cho phép bạn liệt kê tất cả tiến trình và sắp xếp theo mức độ sử dụng CPU giảm dần để xác định nhanh tác nhân gây treo hệ thống.
Bước 2: Truy vấn chi tiết thông tin của một tiến trình cụ thể
ps -p 1234 -f
Sau khi xác định được PID (Process ID), lệnh này giúp bạn xem thông tin đầy đủ về người dùng thực thi, thời điểm bắt đầu và câu lệnh gốc của tiến trình đó.
Bước 3: Kiểm tra sự tồn tại của tiến trình trước khi xử lý
ps -ef | grep nginx
Lệnh này giúp bạn xác nhận trạng thái hoạt động của dịch vụ nginx trong danh sách tiến trình hệ thống để đảm bảo dịch vụ đang chạy đúng cấu hình.
Bước 4: Kết thúc tiến trình gây lỗi hệ thống
kill -9 1234
Khi đã xác định được PID từ lệnh ps, bạn sử dụng lệnh kill để dừng ngay lập tức tiến trình đang gây xung đột hoặc tiêu tốn quá nhiều RAM.
Việc sử dụng lệnh ps trên môi trường VPS đòi hỏi sự chú ý đến các tùy chọn hiển thị để tránh nhiễu thông tin. Trong các tình huống quản trị VPS, việc chạy lệnh ps đơn lẻ thường chỉ trả về danh sách tiến trình tối thiểu, không cung cấp đủ thông tin về CPU hay bộ nhớ. Để kiểm soát tài nguyên hiệu quả, sysadmin cần sử dụng cú pháp ps aux để quan sát chi tiết. Một lỗi phổ biến khi quản trị VPS là không xác định được tiến trình con (child process) gây tiêu tốn tài nguyên do sử dụng sai tham số định dạng. Trường hợp này dẫn đến việc nhầm lẫn giữa tiến trình chính và các tiến trình phụ trong cây hệ thống. Việc kết hợp ps với lệnh grep, ví dụ ps aux | grep nginx, cho phép xác định chính xác ID tiến trình (PID) cần xử lý. Sử dụng các tùy chọn chuẩn giúp tối ưu hóa quá trình debug hệ thống và giám sát hiệu suất server.
Những câu hỏi thường gặp về lệnh ps?
Dưới đây là các tình huống và thắc mắc phổ biến nhất mà người dùng thường gặp khi thao tác với lệnh ps trong hệ điều hành Linux.
Làm thế nào để xem tất cả các tiến trình đang chạy trên hệ thống?
Sử dụng tham số -e hoặc -A để liệt kê mọi tiến trình đang hoạt động tại thời điểm truy vấn.
ps -e
PID TTY TIME CMD
1 ? 00:00:02 systemd
2 ? 00:00:00 kthreadd
Làm sao để hiển thị thông tin chi tiết về các tiến trình?
Kết hợp tham số -ef để xem danh sách tiến trình kèm theo thông tin về UID, PID, PPID và thời gian bắt đầu.
ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:00 ? 00:00:01 systemd user 1234 567 0 10:05 pts/0 00:00:00 bash
Làm thế nào để tìm kiếm một tiến trình cụ thể theo tên?
Sử dụng kết hợp lệnh ps với lệnh grep để lọc ra tiến trình dựa trên từ khóa tên ứng dụng.
ps aux | grep sshd user 2540 0.0 0.1 12345 6789 pts/0 00:00:00 sshd
Cách xem các tiến trình đang tiêu thụ nhiều tài nguyên nhất?
Sử dụng tùy chọn aux để hiển thị chi tiết về tỷ lệ phần trăm CPU và RAM mà mỗi tiến trình đang sử dụng.
ps aux --sort=-%cpu | head -n 5 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1024 5.5 2.1 12345 6789 ? Sl 10:00 0:05 python3
Làm sao để xem thông tin tiến trình dưới dạng cây phân cấp?
Làm thế nào để xem quan hệ cha - con giữa các tiến trình?
Tham số --forest cho phép bạn quan sát cấu trúc phân cấp giữa tiến trình cha và các tiến trình con.
ps -ef --forest UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:00 ? 00:00:01 systemd──── user 1234 567 0 10:05 pts/0 00:00:00 └─bash
Làm thế nào để kiểm tra thông tin của một tiến trình thông qua PID?
Khi đã biết ID của tiến trình, bạn có thể truyền trực tiếp PID đó vào lệnh ps để xem thông tin riêng biệt.
ps -p 1234 PID TTY TIME CMD 1234 pts/0 00:00:00 bash
Lệnh ps là một công cụ mạnh mẽ giúp bạn quan sát và quản lý các tiến trình đang chạy trên hệ thống Linux một cách trực quan nhất. Bằng cách kết hợp tham số -aux để liệt kê chi tiết mọi tiến trình hay sử dụng -ef để xem cây tiến trình theo định dạng chuẩn, bạn có thể dễ dàng kiểm soát tài nguyên hệ thống và phát hiện các ứng dụng đang chạy ngầm, đúng không nhỉ? Việc nắm vững lệnh này chắc chắn sẽ giúp công việc quản trị của bạn trở nên vô cùng thuận tiện và chuyên nghiệp hơn. Chúc bạn thành công!