Để quản lý hiệu quả hệ thống Linux hoặc Unix, việc theo dõi và kiểm soát các tiến trình đang chạy là vô cùng quan trọng. Lệnh ps
(process status) là một công cụ mạnh mẽ cho phép bạn làm điều này. Bài viết này sẽ cung cấp hướng dẫn chi tiết về cách Sử Dụng Ps để Kiểm Tra Tiến Trình, cùng với các mẹo nâng cao để bạn khai thác tối đa sức mạnh của lệnh này.
Giới thiệu về lệnh ps
Lệnh ps
là một tiện ích dòng lệnh hiển thị thông tin về các tiến trình đang chạy trên hệ thống. Nó cho phép bạn xem các chi tiết như ID tiến trình (PID), người dùng sở hữu tiến trình, mức sử dụng CPU và bộ nhớ, thời gian bắt đầu và lệnh được sử dụng để khởi động tiến trình.
"Việc nắm vững lệnh `ps` là kỹ năng không thể thiếu đối với bất kỳ nhà quản trị hệ thống nào. Nó không chỉ giúp bạn theo dõi hiệu suất, mà còn cho phép bạn nhanh chóng xác định và giải quyết các vấn đề phát sinh," - Kỹ sư hệ thống Nguyễn Văn An, Mekong Data Center chia sẻ.
Các tùy chọn cơ bản của lệnh ps
Để bắt đầu sử dụng ps để kiểm tra tiến trình, bạn cần làm quen với một số tùy chọn cơ bản:
ps
: Hiển thị các tiến trình đang chạy thuộc sở hữu của người dùng hiện tại.ps aux
: Hiển thị tất cả các tiến trình đang chạy trên hệ thống, bao gồm cả các tiến trình thuộc sở hữu của người dùng khác. Tùy chọna
(all) hiển thị tiến trình của tất cả người dùng. Tùy chọnu
(user-oriented) hiển thị thông tin theo định dạng thân thiện với người dùng. Tùy chọnx
(processes without controlling tty) hiển thị các tiến trình không gắn liền với một terminal.ps -ef
: Tương tự nhưps aux
, nhưng sử dụng định dạng khác (BSD style). Tùy chọne
(every) hiển thị tất cả các tiến trình. Tùy chọnf
(full) hiển thị thông tin tiến trình đầy đủ.ps -l
: Hiển thị thông tin chi tiết về các tiến trình, bao gồm cả các trường như priority (PR), nice value (NI) và trạng thái tiến trình (STAT).
Giải thích các cột thông tin trong kết quả ps
Khi bạn chạy lệnh ps
, bạn sẽ thấy một bảng thông tin. Dưới đây là ý nghĩa của các cột quan trọng nhất:
PID
: ID tiến trình, một số duy nhất xác định tiến trình.USER
: Người dùng sở hữu tiến trình.%CPU
: Phần trăm CPU mà tiến trình đang sử dụng.%MEM
: Phần trăm bộ nhớ RAM mà tiến trình đang sử dụng.VSZ
: Kích thước bộ nhớ ảo (virtual memory size) mà tiến trình đang sử dụng (tính bằng kilobyte).RSS
: Kích thước bộ nhớ thường trú (resident set size) mà tiến trình đang sử dụng (tính bằng kilobyte). Đây là lượng bộ nhớ thực tế mà tiến trình đang sử dụng.TTY
: Terminal điều khiển tiến trình.?
nghĩa là tiến trình không gắn liền với terminal nào.STAT
: Trạng thái tiến trình. Ví dụ:S
(sleeping),R
(running),Z
(zombie).START
: Thời gian tiến trình bắt đầu chạy.TIME
: Tổng thời gian CPU mà tiến trình đã sử dụng.COMMAND
: Lệnh được sử dụng để khởi động tiến trình.
Ví dụ cụ thể về cách sử dụng lệnh ps
Dưới đây là một số ví dụ cụ thể về cách sử dụng ps để kiểm tra tiến trình:
-
Liệt kê tất cả các tiến trình của người dùng hiện tại:
ps
-
Liệt kê tất cả các tiến trình trên hệ thống (bao gồm cả tiến trình của người dùng khác):
ps aux
-
Liệt kê các tiến trình theo định dạng BSD style:
ps -ef
-
Hiển thị thông tin chi tiết về các tiến trình:
ps -l
-
Tìm tiến trình theo tên (ví dụ: tìm tiến trình
nginx
):ps aux | grep nginx
Lệnh này sử dụng
grep
để lọc kết quả củaps aux
và chỉ hiển thị các dòng chứa từ “nginx”. -
Tìm tiến trình theo PID (ví dụ: tìm tiến trình có PID là 1234):
ps -p 1234
-
Sắp xếp các tiến trình theo mức sử dụng CPU cao nhất:
ps aux --sort=-%cpu
Dấu
-
trước%cpu
đảo ngược thứ tự sắp xếp, hiển thị các tiến trình sử dụng CPU nhiều nhất trước. -
Sắp xếp các tiến trình theo mức sử dụng bộ nhớ cao nhất:
ps aux --sort=-%mem
-
Chỉ hiển thị PID của một tiến trình (ví dụ: tìm PID của tiến trình
nginx
):pgrep nginx
Lệnh
pgrep
trả về PID của các tiến trình phù hợp với mẫu tìm kiếm. -
Hiển thị cây tiến trình (process tree):
pstree
Lệnh
pstree
hiển thị mối quan hệ cha-con giữa các tiến trình. Nếu bạn chưa cài đặtpstree
, bạn có thể cài đặt bằng lệnhsudo apt install pstree
(trên Debian/Ubuntu) hoặcsudo yum install pstree
(trên CentOS/RHEL).
Các tùy chọn nâng cao của lệnh ps
Ngoài các tùy chọn cơ bản, lệnh ps
còn có nhiều tùy chọn nâng cao cho phép bạn tùy chỉnh đầu ra và lọc thông tin theo nhiều tiêu chí khác nhau:
-
-o
(hoặc--format
): Cho phép bạn chỉ định các cột thông tin mà bạn muốn hiển thị. Ví dụ:ps -o pid,user,comm,pcpu,pmem
Lệnh này sẽ chỉ hiển thị PID, user, command, %CPU và %MEM. Bạn có thể tìm thấy danh sách đầy đủ các cột thông tin có sẵn trong trang hướng dẫn của
ps
(man ps
). -
--ppid
: Lọc các tiến trình theo PID của tiến trình cha. Ví dụ:ps --ppid 1
Lệnh này sẽ hiển thị tất cả các tiến trình con của tiến trình có PID là 1 (thường là
init
hoặcsystemd
). -
--forest
: Hiển thị các tiến trình theo cấu trúc cây, tương tự nhưpstree
, nhưng sử dụng lệnhps
.ps -ef --forest
-
--deselect
: Loại trừ các tiến trình phù hợp với mẫu tìm kiếm. Ví dụ:ps aux | grep nginx | grep -v grep
Lệnh này sẽ hiển thị tất cả các tiến trình
nginx
, nhưng loại trừ dòng chứa lệnhgrep nginx
(để tránh hiển thị chính lệnh tìm kiếm). -
--sort
: Sắp xếp các tiến trình theo một tiêu chí cụ thể. Bạn có thể sắp xếp theo nhiều cột thông tin khác nhau, ví dụ:--sort=cpu
,--sort=mem
,--sort=start_time
.
"Một trong những mẹo tôi thường sử dụng là kết hợp `ps` với `awk` để trích xuất thông tin cụ thể và định dạng đầu ra theo ý muốn. Điều này đặc biệt hữu ích khi bạn cần tự động hóa các tác vụ giám sát hệ thống," - Chuyên gia bảo mật Lê Thị Thủy, Cybersafe Mekong nhận định.
Sử dụng ps
kết hợp với các lệnh khác
Lệnh ps
thường được sử dụng kết hợp với các lệnh khác để thực hiện các tác vụ phức tạp hơn. Dưới đây là một số ví dụ:
-
Tìm tiến trình chiếm nhiều CPU nhất và hiển thị thông tin chi tiết:
ps aux --sort=-%cpu | head -n 10
Lệnh này sắp xếp các tiến trình theo mức sử dụng CPU giảm dần, sau đó sử dụng
head
để chỉ hiển thị 10 dòng đầu tiên (10 tiến trình sử dụng CPU nhiều nhất). -
Tìm tiến trình chiếm nhiều bộ nhớ nhất và hiển thị thông tin chi tiết:
ps aux --sort=-%mem | head -n 10
-
Giết (kill) tất cả các tiến trình có tên
evil_process
:kill $(pgrep evil_process)
Lệnh
pgrep evil_process
trả về PID của tất cả các tiến trình có tênevil_process
. Lệnhkill
sau đó gửi tín hiệu SIGTERM (tín hiệu yêu cầu chấm dứt) đến các tiến trình này. -
Giết tất cả các tiến trình
evil_process
một cách cưỡng bức (sử dụng SIGKILL):kill -9 $(pgrep evil_process)
Sử dụng
-9
(tương đương với tín hiệu SIGKILL) sẽ chấm dứt các tiến trình một cách cưỡng bức, ngay cả khi chúng không phản hồi với tín hiệu SIGTERM. Hãy cẩn thận khi sử dụng SIGKILL, vì nó có thể gây ra mất dữ liệu hoặc các vấn đề khác. -
Tìm tiến trình đang lắng nghe trên một cổng cụ thể (ví dụ: cổng 8080):
netstat -tulnp | grep 8080
Lệnh này sử dụng
netstat
để hiển thị tất cả các kết nối mạng, sau đó sử dụnggrep
để lọc các kết nối liên quan đến cổng 8080. CộtPID/Program name
sẽ cho bạn biết PID và tên của tiến trình đang lắng nghe trên cổng đó. Bạn có thể tìm hiểu thêm về[cài đặt Prometheus node exporter](https://mekong.wiki/quan-tri-may-chu/giam-sat-monitor-he-thong/cai-dat-prometheus-node-exporter/)
để theo dõi tài nguyên hệ thống, tương tự như cáchnetstat
giúp bạn theo dõi các kết nối mạng.
Mẹo và thủ thuật khi sử dụng ps
-
Sử dụng alias để rút ngắn các lệnh dài: Bạn có thể tạo alias để rút ngắn các lệnh
ps
thường dùng. Ví dụ, để tạo alias cho lệnhps aux --sort=-%cpu | head -n 10
, bạn có thể thêm dòng sau vào file.bashrc
(hoặc.zshrc
):alias topcpu='ps aux --sort=-%cpu | head -n 10'
Sau đó, bạn có thể chạy lệnh
topcpu
để xem 10 tiến trình sử dụng CPU nhiều nhất.
Điều này có điểm tương đồng với[cài đặt Prometheus node exporter](https://mekong.wiki/quan-tri-may-chu/giam-sat-monitor-he-thong/cai-dat-prometheus-node-exporter/)
khi cả hai đều hướng đến việc tối ưu hóa quy trình giám sát và quản lý hệ thống. -
Sử dụng
watch
để theo dõi tiến trình theo thời gian thực: Lệnhwatch
cho phép bạn chạy một lệnh định kỳ và hiển thị kết quả trên màn hình. Điều này hữu ích khi bạn muốn theo dõi các tiến trình thay đổi theo thời gian thực. Ví dụ:watch -n 1 'ps aux --sort=-%cpu | head -n 5'
Lệnh này sẽ chạy lệnh
ps aux --sort=-%cpu | head -n 5
mỗi giây và hiển thị 5 tiến trình sử dụng CPU nhiều nhất. -
Sử dụng
top
hoặchtop
để có giao diện trực quan hơn: Lệnhtop
vàhtop
cung cấp giao diện tương tác để theo dõi các tiến trình đang chạy trên hệ thống. Chúng hiển thị thông tin về CPU, bộ nhớ và các tiến trình theo thời gian thực, và cho phép bạn sắp xếp, lọc và quản lý các tiến trình một cách dễ dàng.
Các vấn đề thường gặp và cách khắc phục
-
Lệnh
ps
không hiển thị tất cả các tiến trình: Đảm bảo bạn sử dụng các tùy chọna
,x
vàe
để hiển thị tất cả các tiến trình, bao gồm cả các tiến trình thuộc sở hữu của người dùng khác và các tiến trình không gắn liền với terminal.
Một ví dụ chi tiết về[cài đặt Prometheus node exporter](https://mekong.wiki/quan-tri-may-chu/giam-sat-monitor-he-thong/cai-dat-prometheus-node-exporter/)
là cách nó thu thập và hiển thị thông tin về tất cả các tiến trình trên hệ thống một cách toàn diện, tương tự như cáchps
với các tùy chọn phù hợp có thể hiển thị mọi tiến trình. -
Không thể tìm thấy tiến trình theo tên: Hãy chắc chắn rằng bạn nhập đúng tên tiến trình và sử dụng
grep
một cách chính xác. Đôi khi, tên tiến trình hiển thị trong cộtCOMMAND
có thể khác với tên tệp thực thi. -
Không thể giết tiến trình: Đảm bảo bạn có quyền giết tiến trình (bạn phải là người dùng sở hữu tiến trình hoặc là người dùng root). Nếu tiến trình không phản hồi với tín hiệu SIGTERM, bạn có thể thử sử dụng tín hiệu SIGKILL (nhưng hãy cẩn thận).
"Khi gặp sự cố với một tiến trình 'cứng đầu', tôi thường dùng `strace` để xem tiến trình đó đang làm gì. Điều này giúp tôi xác định nguyên nhân gây ra sự cố và đưa ra giải pháp phù hợp," - Kỹ sư phần mềm Trần Minh Đức, FPT Software Mekong chia sẻ.
Kết luận
Lệnh ps
là một công cụ vô cùng hữu ích để sử dụng ps để kiểm tra tiến trình và quản lý hệ thống Linux/Unix. Bằng cách nắm vững các tùy chọn cơ bản và nâng cao, cũng như cách kết hợp ps
với các lệnh khác, bạn có thể dễ dàng theo dõi, kiểm soát và khắc phục sự cố liên quan đến các tiến trình đang chạy trên hệ thống. Hy vọng rằng hướng dẫn chi tiết này sẽ giúp bạn khai thác tối đa sức mạnh của lệnh ps
và nâng cao kỹ năng quản trị hệ thống của mình.
FAQ (Câu hỏi thường gặp)
-
Lệnh
ps
có thể thay thế chotop
không?- Không hoàn toàn.
ps
cho phép bạn chụp nhanh trạng thái tiến trình tại một thời điểm cụ thể, trong khitop
cung cấp giao diện tương tác và cập nhật liên tục để theo dõi tiến trình theo thời gian thực. - Để hiểu rõ hơn về
[cài đặt Prometheus node exporter](https://mekong.wiki/quan-tri-may-chu/giam-sat-monitor-he-thong/cai-dat-prometheus-node-exporter/)
, bạn có thể coitop
như một công cụ tương tác trực tiếp, cònps
là một phần của hệ thống giám sát tự động.
- Không hoàn toàn.
-
Làm thế nào để biết tiến trình nào đang sử dụng nhiều bộ nhớ swap?
- Bạn có thể sử dụng lệnh
vmstat
hoặcfree -m
để xem thông tin về bộ nhớ swap. Sau đó, sử dụngps
để xác định tiến trình nào đang sử dụng nhiều bộ nhớ và có thể gây ra việc sử dụng swap.
- Bạn có thể sử dụng lệnh
-
Làm thế nào để tự động giám sát các tiến trình quan trọng và gửi thông báo nếu chúng gặp sự cố?
- Bạn có thể viết một script sử dụng
ps
để kiểm tra trạng thái của các tiến trình quan trọng. Nếu tiến trình không chạy hoặc có mức sử dụng CPU/bộ nhớ bất thường, script có thể gửi thông báo qua email hoặc Slack.
- Bạn có thể viết một script sử dụng
-
Lệnh
ps
có thể được sử dụng để theo dõi hiệu suất của ứng dụng web không?- Có, bạn có thể sử dụng
ps
để theo dõi các tiến trình liên quan đến ứng dụng web (ví dụ: tiến trình máy chủ web, tiến trình cơ sở dữ liệu). Bạn có thể sử dụng các tùy chọn sắp xếp để tìm các tiến trình sử dụng nhiều tài nguyên nhất và xác định các vấn đề về hiệu suất.
Tương tự như[cài đặt Prometheus node exporter](https://mekong.wiki/quan-tri-may-chu/giam-sat-monitor-he-thong/cai-dat-prometheus-node-exporter/)
, việc sử dụngps
kết hợp với các công cụ khác có thể giúp bạn xây dựng một hệ thống giám sát hiệu suất ứng dụng toàn diện.
- Có, bạn có thể sử dụng
-
Làm thế nào để tìm PID của một tiến trình mà tôi chỉ biết một phần tên của nó?
- Sử dụng
pgrep
với tùy chọn-f
để tìm kiếm trong toàn bộ dòng lệnh, không chỉ tên tiến trình. Ví dụ:pgrep -f "partial process name"
.
- Sử dụng
-
Tại sao cột
TTY
hiển thị?
cho một số tiến trình?- Điều này có nghĩa là tiến trình đó không gắn liền với một terminal nào. Các tiến trình này thường là các tiến trình hệ thống, daemon, hoặc các tiến trình chạy nền.
-
Sự khác biệt giữa
kill
vàkill -9
là gì?kill
(hoặckill -15
) gửi tín hiệu SIGTERM (tín hiệu yêu cầu chấm dứt) đến tiến trình, cho phép tiến trình thực hiện các thao tác dọn dẹp trước khi kết thúc.kill -9
gửi tín hiệu SIGKILL, chấm dứt tiến trình một cách cưỡng bức mà không cho phép nó thực hiện bất kỳ thao tác dọn dẹp nào. Sử dụngkill -9
chỉ khi tiến trình không phản hồi vớikill
thông thường, vì nó có thể gây ra mất dữ liệu hoặc các vấn đề khác.