监控 Linux 系统是任何 Linux 用户或系统管理员都需要全天候执行的最典型的任务之一,以确保系统运行平稳并避免使用瓶颈。Linux 使用一些内置工具船可以帮助您监视系统。其中之一是 PS (processes status) 命令,该命令专门监视运行过程以及与过程相关的其他指标,例如 cpu 和 memory 利用率。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
也可以使用 -e
选项,仍然会得到类似的结果。
[linuxtechi@webserver ~]$ ps -e
(4) 以 BSD 格式显示输出
需要以 BSD 格式列出进程,使用此命令
$ ps -aux
让我们分析一下这条命令:
-a
选项指示 ps 显示来自所有用户的所有进程,但是这排除了与特定终端相关联的进程。
-u
选项表示面向用户的格式,它提供与正在运行的进程相关的更详细的信息。
-x
选项列出了通常在系统引导时启动的进程以及后台进程。
术语介绍:
- 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 命令列出有关进程的详细信息
术语介绍:
- PPID: 父进程 ID
- C: 进程的 CPU 使用率的百分比
- STIME: 命令启动的时间,等同于 START
(6) 以用户定义的格式显示输出
在用户定义的格式输出中,您可以决定要显示哪些列。-o
选项决定在运行 ps 命令时将显示哪些列。在下面的例子中,只显示了PID 和 START 列。一定要注意,列选项在 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
也可以使用用户的 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
对于 root 用户,执行该命令
$ ps -u root
类似地,可以使用 root 用户的 uid (值为 0) 进行检查
$ ps -u 0
(8) 显示组进程
列出组进程类似于列出用户进程。您可以使用 ps 命令通过指定组 ID或者组名称来列出一个组进程。
$ ps -fG <group-name>
例如,要显示与 apache 组相关联的进程,运行该命令
$ ps -fG apache
另外,您可以传递组 ID(GID)而不是组名称。您可以从 /etc /group 文件中获取 GID。
例如,在本例中,Apache 的组 ID 为 48。因此,与其指定组名 apache,不如直接指定 GID 号。
$ ps -fG 48
(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
(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
(12) 打印流程树
进程树显示了 Linux 系统中进程是如何链接的。没有父进程的进程通过 init 或 systemd 链接到系统。打印要求您使用以下格式:
$ ps -e --forest
(13) 根据线程过滤一个进程
要使用进程线程筛选进程,请使用 -L
标志,如下所示
$ ps -L 1446
(14) 实时过程监控
可以使用 watch 实用程序监视进程的静态信息。输出每秒钟更新一次,如下所示
$ watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'
(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 命令的示例输出
(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=
(18) 显示进程运行的持续时间
要显示进程已经运行了多长时间,可以运行以下命令
$ ps -eo comm,etime,user
使用下面的 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。