监控 Linux 系统是任何 Linux 用户或系统管理员都需要全天候执行的最典型的任务之一,以确保系统运行平稳并避免使用瓶颈。Linux 使用一些内置工具船可以帮助您监视系统。其中之一是 PS (processes status) 命令,该命令专门监视运行过程以及与过程相关的其他指标,例如 cpumemory 利用率。PS 命令读取基于 RAM 或虚拟文件系统的 /proc 文件系统。

在本指南中,我们将深入研究 20 个最常用的 ps 命令。

(1) 在 Shell 中列印进程

ps 命令是 linux 中最简单的形式,列出当前 shell 中正在运行的进程。

[linuxtechi@webserver ~]$ ps
 PID TTY          TIME CMD
 1437 pts/0    00:00:00 bash
 1465 pts/0    00:00:00 ps
[linuxtechi@webserver ~]$

让我们定义几个术语:

  • PID: This is the Process ID.
  • TTY: This refers to the terminal that started and is controlling the process.
  • TIME: This is the time / cumulative time that a process has run for.
  • CMD: Name of the command that started the process.

(2) 列出与终端相关联的进程

这非常类似于在 shell 中列出进程。要列出与当前正在运行的终端相关联的进程,可以执行该命令

[linuxtechi@webserver ~]$ ps -T
  PID  SPID TTY          TIME CMD
 1437  1437 pts/0    00:00:00 bash
13357 13357 pts/0    00:00:00 ps
[linuxtechi@webserver ~]$

(3) 显示系统上所有正在运行的进程

要获得 Linux 系统上正在运行的所有进程的概览,请使用 -A 选项

[linuxtechi@webserver ~]$ ps -A

ps-command-display-all-running-process

也可以使用 -e选项,仍然会得到类似的结果。

[linuxtechi@webserver ~]$ ps -e

(4) 以 BSD 格式显示输出

需要以 BSD 格式列出进程,使用此命令

$ ps -aux

让我们分析一下这条命令:

-a 选项指示 ps 显示来自所有用户的所有进程,但是这排除了与特定终端相关联的进程。

-u 选项表示面向用户的格式,它提供与正在运行的进程相关的更详细的信息。

-x选项列出了通常在系统引导时启动的进程以及后台进程。

ps-command-output-bsd-format

术语介绍:

  • USER – 运行进程的用户
  • PID – 进程 ID
  • %CPU – CPU 使用率百分比
  • %MEM – 物理内存占用的百分比
  • VSZ – 千字节为单位的每个进程的虚拟内存大小
  • RSS – 使用的物理内存的大小
  • STAT – 进程状态代码 S (sleeping), Z (zombie) and R (Running)
  • START – 进程开始运行的时间

(5) 以 UNIX 格式显示输出

如果您想以 UNIX 格式显示输出,请使用 -ef 的选项组合执行 PS 命令

[linuxtechi@webserver ~]$ ps -ef

-e 选项告诉 ps 命令列出所有进程

-f (full format) 选项指示 ps 命令列出有关进程的详细信息

ps-command-output-unix-format-linux

术语介绍:

  • PPID: 父进程 ID
  • C: 进程的 CPU 使用率的百分比
  • STIME: 命令启动的时间,等同于 START

(6) 以用户定义的格式显示输出

在用户定义的格式输出中,您可以决定要显示哪些列。-o 选项决定在运行 ps 命令时将显示哪些列。在下面的例子中,只显示了PIDSTART 列。一定要注意,列选项在 ps 命令中以小写形式传递。

[linuxtechi@webserver ~]$ ps -efo pid,start
  PID  STARTED
 1437 21:55:28
13632 01:41:16
[linuxtechi@webserver ~]$

(7) 显示用户当前正在运行的进程

有时,您可能希望找出与某个用户相关联的进程,因此要实现此目的,请使用 -u 选项,如图所示

$ ps -u user

OR

$ ps -u uid

例如,要查看与 Linuxtechi 用户相关联的进程,运行该命令

$ ps -u linuxtechi

User-Specific-Process-ps-command-Linux

也可以使用用户的 uid (user ID)。可以通过运行该命令获取用户的 id

$ id user

[linuxtechi@webserver ~]$ id linuxtechi
uid=1000(linuxtechi) gid=1000(linuxtechi) groups=1000(linuxtechi),10(wheel)
[linuxtechi@webserver ~]$

从上面的输出中,我们可以清楚地看到用户 linuxtechi 的 uid 是 1000。然后,可以使用 ps 命令和 uid 查找与该用户关联的进程。

$ ps -u 1000

id-based-process-ps-command-linux

对于 root 用户,执行该命令

$ ps -u root

root-owned-process-linux

类似地,可以使用 root 用户的 uid (值为 0) 进行检查

$ ps -u 0

(8) 显示组进程

列出组进程类似于列出用户进程。您可以使用 ps 命令通过指定组 ID或者组名称来列出一个组进程。

$ ps -fG <group-name>

例如,要显示与 apache 组相关联的进程,运行该命令

$ ps -fG apache

group-based-process-linux-ps-command

另外,您可以传递组 ID(GID)而不是组名称。您可以从 /etc /group 文件中获取 GID。

例如,在本例中,Apache 的组 ID 为 48。因此,与其指定组名 apache,不如直接指定 GID 号。

$ ps -fG 48

group-id-based-process-linux-ps-command

(9) 使用 PID 和 PPID 显示进程

Linux 进程也可以使用 PID (进程 ID) 和 PPID (父进程 ID) 来显示。PPID 是指进程的父进程的 PID。

按 PID 列出进程,使用命令

$ ps -fp PID

例如,要列出与 PID 1286 相关的进程,可以运行以下命令

[linuxtechi@webserver ~]$ ps -fp 1286
UID        PID  PPID  C STIME TTY          TIME CMD
postfix   1286  1285  0 03:49 ?        00:00:00 pickup -l -t unix -u
[linuxtechi@webserver ~]$

要按 PPID 列出进程,请运行

$ ps -f –ppid <ppid-number>

For example, to list processes owned by PPID 31903 run

例如,列出 PPID 31903 拥有的进程

$ ps -f --ppid 31903

process-based-on-ppid-ps-command

(10) 使用进程名查找 PID

在大多数情况下,我们通常不知道进程名的 PID。为此,使用 -C 选项

$ ps -C <process-name>

[linuxtechi@webserver ~]$ ps -C firefox
  PID TTY          TIME CMD
 1446 tty2     00:00:04 firefox
[linuxtechi@webserver ~]$

(11) 使用 TTY 显示进程

If you wish to filter processes by the tty value use the -t flag . For example to display the processes attached to tty1, run the ps command as shown:

如果您希望通过 tty 值筛选进程,请使用 -t 标志。例如,要显示附加到 tty1 的进程

$ ps -ft tty1

list-tty-process-ps-command-linux

(12) 打印流程树

进程树显示了 Linux 系统中进程是如何链接的。没有父进程的进程通过 init 或 systemd 链接到系统。打印要求您使用以下格式:

$ ps -e --forest

process-tree-ps-command-linux

(13) 根据线程过滤一个进程

要使用进程线程筛选进程,请使用 -L 标志,如下所示

$ ps -L 1446

process-thread-ps-command-linux

(14) 实时过程监控

可以使用 watch 实用程序监视进程的静态信息。输出每秒钟更新一次,如下所示

$ watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'

watch-command-process-monitor-linux-ps

(15) 解决 Linux 机器的性能问题

当您的系统缓慢或超载时,您可以通过最高的 CPU 和内存使用筛选进程

执行以下 ps 命令列出消耗高内存的顶级进程

$ ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

执行以下 ps 命令列出消耗高 cpu 的顶级进程

$ ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head

下面是我的系统上 ps 命令的示例输出

top-process-memory-cpu-ps-command-linux

(16) 杀死无响应的进程

ps 命令可以让您杀死没有响应的应用程序或占用 CPU 和 RAM 的任何进程。为此,您需要使用该命令找到特定应用程序的 PID

$ ps -A | grep -i stress

找到进程的 PID 后,可以使用 kill 命令终止它,示例如下所示

$ kill -9 2583 2584

(17) 列出进程相关的所有 PID

可以使用该语法列出与进程相关的所有 pid

$ ps -C <process-name> -o pid=

例如找出与 httpd web 服务器运行相关的 pid

$ ps -C httpd -o pid=

pids-process-linux-ps-command

(18) 显示进程运行的持续时间

要显示进程已经运行了多长时间,可以运行以下命令

$ ps -eo comm,etime,user

process-duration-linux-ps-command

使用下面的 ps 命令了解特定进程已经运行了多长时间

$ ps -o etime -p <pid>

假设我们想知道 MySQL 进程已经运行了多长时间

[linuxtechi@webserver ~]$  ps -C mysqld -o pid=
 3807
[linuxtechi@webserver ~]$
[linuxtechi@webserver ~]$ ps -o etime -p 3807
    ELAPSED
   01:13:56
[linuxtechi@webserver ~]$

(19) 列出进程的子进程

要打印或列出进程的子进程,请在下面的语法中使用 -C 标志

$ ps -C <process-name>

例如,要列出与 httpd 进程关联的子进程,请运行

[linuxtechi@webserver ~]$ ps -C httpd
  PID TTY          TIME CMD
31911 ?        00:00:00 httpd
31918 ?        00:00:00 httpd
31919 ?        00:00:00 httpd
31920 ?        00:00:01 httpd
31921 ?        00:00:01 httpd
31922 ?        00:00:01 httpd
[linuxtechi@webserver ~]$

(20) 使用 grep 过滤 ps 命令的输出

为了在 ps 命令中获得特定的结果,您可以将输出管道传输到 grep 实用工具并提供搜索条件。

例如,要搜索或缩小范围到 php 进程,可以运行该命令

$ ps -ef | grep php

grep-ps-command-output-linux

我的开源项目

酷瓜云课堂


鸠摩智首席音效师
472 声望9 粉丝

身强体健,龙精虎猛的活着。