Giải thích lệnh ps trong Linux cùng ví dụ chi tiết

Lệnh ps (Process Status) trong Linux được dùng để hiển thị thông tin về các tiến trình (process) đang hoạt động trên hệ thống. Đây là một công cụ dòng lệnh cơ bản nhưng rất mạnh mẽ, cho phép bạn xem trạng thái, PID, mức sử dụng tài nguyên, và mối quan hệ giữa các tiến trình.

Cú pháp cơ bản:

ps [tùy_chọn]

Nếu bạn muốn theo dõi thời gian thực, hãy dùng lệnh top. Lệnh ps thường được kết hợp với kill để dừng các tiến trình không mong muốn.

Các tùy chọn thường gặp

  • -A hoặc -e: Hiển thị tất cả các tiến trình.
  • -f: Định dạng đầy đủ (bao gồm thêm thông tin).
  • -u userlist: Hiển thị tiến trình của một hoặc nhiều người dùng cụ thể.
  • u: Định dạng dựa trên người dùng.
  • a: Hiển thị tất cả tiến trình có gắn với terminal (TTY). Khi kết hợp với x, hiển thị mọi tiến trình.
  • x: Hiển thị tiến trình thuộc người dùng hiện tại hoặc tất cả (khi kết hợp với a).
  • -H: Hiển thị cấu trúc phân cấp (dạng cây).
  • -j hoặc j: Định dạng công việc (job format).

Hai cách dùng phổ biến nhất là ps aux (định dạng BSD) và ps -ef (định dạng chuẩn).

Ví dụ thực tế

1) Hiển thị tất cả tiến trình

[root@CentOS6 ~]# ps -e | head -20
  PID TTY          TIME CMD
    1 ?        00:00:02 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 migration/0
    4 ?        00:00:00 ksoftirqd/0
    5 ?        00:00:00 stopper/0
    6 ?        00:00:00 watchdog/0
    7 ?        00:00:00 migration/1
    8 ?        00:00:00 stopper/1
    9 ?        00:00:00 ksoftirqd/1
   10 ?        00:00:00 watchdog/1
   11 ?        00:00:00 events/0
   12 ?        00:00:00 events/1
   13 ?        00:00:00 events/0
   14 ?        00:00:00 events/1
   15 ?        00:00:00 events_long/0
   16 ?        00:00:00 events_long/1
   17 ?        00:00:00 events_power_ef
   18 ?        00:00:00 events_power_ef
   19 ?        00:00:00 cgroup
   ...

2) Lọc tiến trình của người dùng cụ thể

[root@CentOS6 ~]# ps -u root | head -10
  PID TTY          TIME CMD
    1 ?        00:00:02 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 migration/0
    4 ?        00:00:00 ksoftirqd/0
    5 ?        00:00:00 stopper/0
    6 ?        00:00:00 watchdog/0
    7 ?        00:00:00 migration/1
    8 ?        00:00:00 stopper/1
    9 ?        00:00:00 ksoftirqd/1

3) So sánh ps aps -a

[root@CentOS6 ~]# ps a
  PID TTY      STAT   TIME COMMAND
 2013 tty2     Ss+   0:00 /sbin/mingetty /dev/tty2
 2020 tty3     Ss+   0:00 /sbin/mingetty /dev/tty3
 2030 tty4     Ss+   0:00 /sbin/mingetty /dev/tty4
 2033 tty5     Ss+   0:00 /sbin/mingetty /dev/tty5
 2035 tty6     Ss+   0:00 /sbin/mingetty /dev/tty6
 2053 tty1     Ssl+  2:26 /usr/bin/Xorg :0 ...
 4428 pts/1    Ss    0:00 /bin/bash
 4438 pts/1    T     0:00 more -10
 4449 pts/1    R+    0:00 ps a

[root@CentOS6 ~]# ps -a
  PID TTY          TIME CMD
 4438 pts/1    00:00:00 more
 4450 pts/1    00:00:00 ps

4) Hiển thị đầy đủ thông tin (bao gồm dòng lệnh)

[root@CentOS6 ~]# ps -ef | head -15
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:10 ?        00:00:02 /sbin/init
root         2     0  0 14:10 ?        00:00:00 [kthreadd]
root         3     2  0 14:10 ?        00:00:00 [migration/0]
root         4     2  0 14:10 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 14:10 ?        00:00:00 [stopper/0]
root         6     2  0 14:10 ?        00:00:00 [watchdog/0]
root         7     2  0 14:10 ?        00:00:00 [migration/1]
root         8     2  0 14:10 ?        00:00:00 [stopper/1]
root         9     2  0 14:10 ?        00:00:00 [ksoftirqd/1]
root        10     2  0 14:10 ?        00:00:00 [watchdog/1]
...

Giải thích cột:

  • UID: Người dùng sở hữu tiến trình.
  • PID: ID tiến trình.
  • PPID: ID tiến trình cha.
  • C: Tỷ lệ sử dụng CPU.
  • STIME: Thời gian khởi động tiến trình.
  • TTY: Terminal liên kết (dấu ? nghĩa là không có terminal).
  • TIME: Tổng thời gian CPU đã dùng.
  • CMD: Lệnh đã thực thi.

5) Kết hợp ps với grep để tìm tiến trình

[root@CentOS6 ~]# ps -ef | grep ksoftirqd/0
root         4     2  0 14:10 ?        00:00:00 [ksoftirqd/0]
root      4534  4484  0 18:54 pts/0    00:00:00 grep ksoftirqd/0

6) Xem tiến trình thuộc phiên đăng nhập hiện tại

[root@CentOS6 ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  4568  4566  0  80   0 - 27087 wait   pts/0    00:00:00 bash
4 R     0  4578  4568  0  80   0 - 27035 -      pts/0    00:00:00 ps

Chú thích cột bổ sung:

  • S: Trạng thái (R=đang chạy, S=ngủ, T=dừng, Z=zombie).
  • PRINI: Mức ưu tiên.
  • ADDR: Địa chỉ bộ nhớ.
  • SZ: Kích thước bộ nhớ ảo.
  • WCHAN: Kernel function đang chờ (nếu có).

7) Hiển thị cấu trúc cây giữa các tiến trình

[root@CentOS6 ~]# ps f
  PID TTY      STAT   TIME COMMAND
 4568 pts/0    Ss     0:00 /bin/bash
 4630 pts/0    R+     0:00  \_ ps f
 2053 tty1     Ssl+   2:48 /usr/bin/Xorg :0 ...
 2035 tty6     Ss+    0:00 /sbin/mingetty /dev/tty6
 2033 tty5     Ss+    0:00 /sbin/mingetty /dev/tty5
 2030 tty4     Ss+    0:00 /sbin/mingetty /dev/tty4
 2020 tty3     Ss+    0:00 /sbin/mingetty /dev/tty3
 2013 tty2     Ss+    0:00 /sbin/mingetty /dev/tty2

8) Liệt kê tất cả tiến trình trong bộ nhớ (định dạng BSD)

[root@CentOS6 ~]# ps aux | head -15
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  19352  1552 ?        Ss   14:10   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    14:10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:10   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    14:10   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    14:10   0:00 [stopper/0]
root         6  0.0  0.0      0     0 ?        S    14:10   0:00 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    14:10   0:00 [migration/1]
root         8  0.0  0.0      0     0 ?        S    14:10   0:00 [stopper/1]
root         9  0.0  0.0      0     0 ?        S    14:10   0:00 [ksoftirqd/1]
...

Giải thích cột bổ sung:

  • %CPU: Phần trăm CPU sử dụng.
  • %MEM: Phần trăm bộ nhớ vật lý.
  • VSZ: Bộ nhớ ảo (KB).
  • RSS: Bộ nhớ thường trú (KB).
  • STAT: Trạng thái với các ký hiệu mở rộng: < (ưu tiên cao), N (ưu tiên thấp), L (có trang bộ nhớ bị khóa), s (tiến trình điều khiển phiên), l (đa luồng), + (ở nền trước).
  • START: Thời điểm tiến trình được khởi tạo.

9) Hiển thị cây tiến trình với PID và mối quan hệ

[root@CentOS6 ~]# ps -axjf | head -15
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2     4     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
    2     5     0     0 ?           -1 S        0   0:00  \_ [stopper/0]
    2     6     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]
    2     7     0     0 ?           -1 S        0   0:00  \_ [migration/1]
    2     8     0     0 ?           -1 S        0   0:00  \_ [stopper/1]
    2     9     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/1]
...

Kiến thức nâng cao

Vòng đời của tiến trình

Tiến trình cha tạo ra tiến trình con bằng lệnh fork(). Mỗi tiến trình có một ID duy nhất (PID). Tiến trình gốc (PID=1) là init trên CentOS 5/6 hoặc systemd trên CentOS 7 trở lên.

Zombie process là gì?

Khi tiến trình con kết thúc nhưng tiến trình cha chưa gọi wait() để dọn dẹp, trạng thái của con vẫn tồn tại trong bảng tiến trình. Đó gọi là zombie process. Nếu cha thoát trước con, những con không có cha quản lý sẽ trở thành zombie.

Các thuộc tính của tiến trình

  • PID: ID duy nhất.
  • PPID: ID của tiến trình cha.
  • UID/GID: Người dùng và nhóm sở hữu.
  • Trạng thái: R (đang chạy), S (ngủ), Z (zombie), D (không ngắt được), T (dừng).
  • Mức ưu tiên: Thể hiện qua giá trị PRINI.
  • Tài nguyên: CPU, bộ nhớ, thời gian sử dụng.

Lệnh bổ trợ: pstree

pstree hiển thị tiến trình dưới dạng cây. Mặc định, nó gộp các tiến trình cùng tên.

Ví dụ không có tham số

[xf@xuexi ~]$ pstree | head -10
systemd-+-ModemManager---2*[{ModemManager}]
        |-NetworkManager-+-dhclient
        |                `-2*[{NetworkManager}]
        |-VGAuthService
        |-abrt-dbus---2*[{abrt-dbus}]
        ...

Ví dụ hiển thị PID

[xf@xuexi ~]$ pstree -p | head -10
systemd(1)-+-ModemManager(6833)-+-{ModemManager}(6858)
           |                    `-{ModemManager}(6877)
           |-NetworkManager(6988)-+-dhclient(7291)
           |                      |-{NetworkManager}(6995)
           |                      `-{NetworkManager}(6998)
           |-VGAuthService(6831)
           ...

Thẻ: linux ps-process-status process-management command-line terminal

Đăng vào ngày 29 tháng 6 lúc 16:03