第 51 课:ps 进程查看
课程名称: Linux 系统管理与运维 当前课: 第 51 课 - ps 进程查看 所属模块: 进程管理 难度: beginner 标签: ps, processes 上一课: 实用脚本编写实战 下一课: top 与 htop 实时监控
学习目标
通过本课的学习,你将能够:
- 理解
ps命令的基本作用和核心概念。 - 掌握
ps命令的两种主要语法风格及其常用参数。 - 学会解读
ps命令的输出信息,识别关键进程属性。 - 能够组合参数,灵活地查看、过滤系统中的进程。
- 了解
ps命令在日常运维中的常见应用场景。
核心概念
在 Linux 中,进程是正在运行的程序的实例。每个进程都有一个唯一的 PID(进程ID),就像我们的身份证号。系统管理和故障排查的第一步,往往是先“看看发生了什么”,这时就需要用到 ps 命令。
ps (Process Status) 是一个非常经典、强大的命令行工具,用于显示系统当前运行进程的瞬间快照。你可以把它想象成系统里的“任务管理器”或“活动监视器”,但它以命令行形式呈现,信息更丰富,更适合脚本调用。
ps 的参数风格有点特殊,它支持两种格式:
- UNIX 风格:选项前用一个短横线
-,例如ps -e。 - BSD 风格:选项前不使用短横线,例如
ps aux。
这两种风格都可以完成工作,但输出格式和某些参数的含义略有不同。初学者不必纠结于选择哪种,掌握几个最常用的组合即可。
代码示例
首先,我们打开你的 Linux 终端,一起来实践一下。
1. 最简单的用法:查看当前终端的进程
# 在终端中直接输入 ps,不带任何参数
ps
预期输出示例:
PID TTY TIME CMD
5678 pts/0 00:00:00 bash
6789 pts/0 00:00:00 ps
PID: 进程ID。TTY: 进程关联的终端。pts/0表示第一个伪终端。TIME: 进程消耗的CPU总时间。CMD: 启动该进程的命令。
2. 查看系统上所有用户的所有进程(最常用)
BSD 风格 (aux):
# a:显示所有用户的进程
# u:以用户为中心的详细格式(显示用户、CPU、内存等)
# x:包含没有控制终端的进程(如后台服务)
ps aux
预期输出示例(节选):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 16964 3260 ? Ss Mar01 0:03 /sbin/init
www-data 1234 0.5 2.1 51234 45678 ? S 10:30 1:20 /usr/sbin/apache2 -k start
yourname 5678 0.0 0.1 22532 5120 pts/0 Ss 14:00 0:00 -bash
关键列解读:
USER: 进程所属用户。%CPU: CPU使用率。%MEM: 内存使用率(物理内存)。STAT: 进程状态码。S(休眠),R(运行),Z(僵尸进程),s(会话领导), `+(前台进程组)。COMMAND: 完整的启动命令。
UNIX 风格 (-ef):
# -e:显示所有进程(等同于BSD的 a 和 x)
# -f:全格式列表(显示UID, PPID等更多详情)
ps -ef
预期输出示例(节选):
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Mar01 ? 00:00:03 /sbin/init
www-data 1234 1 0 10:30 ? 00:01:20 /usr/sbin/apache2 -k start
yourname 5678 5677 0 14:00 pts/0 00:00:00 -bash
关键列解读:
PPID: 父进程ID(谁启动了我)。C: CPU使用的整数值(用于调度)。STIME: 进程启动时间。
3. 组合使用 grep 过滤特定进程
这是运维中最常见的操作之一。
# 查找所有与 “apache2” 相关的进程
ps aux | grep apache2
# 或者使用更精确的 pgrep 命令(只输出PID)
pgrep -a apache2
4. 自定义输出格式
# 只查看特定列,如PID, 用户, CPU%, 命令
ps -eo pid,user,%cpu,comm
实践练习
-
基础查看:执行
ps aux | head命令,查看输出的前几行。找到init或systemd进程(PID通常为1),记录它的USER、STAT和COMMAND信息。 -
进程过滤:使用
ps命令和grep管道组合,找出当前系统中所有由root用户运行的、且命令名称中包含ssh的进程。提示:先用ps aux列出所有进程,再用grep过滤。 -
父子进程关系:使用
ps -ef命令,找到你当前bash终端进程的 PID。然后,再查看它的PPID(父进程ID),思考这个父进程可能是谁?(通常是你的终端模拟器,如sshd或terminal)。
预期输出参考:
- 练习1的输出中应能找到类似
root 1 0.0 0.1 ... /sbin/init的行。 - 练习2的命令可能是
ps aux | grep '[r]oot.*ssh'(方括号技巧可以避免grep自身出现在结果中)。 - 练习3会先看到类似
PID=5678, CMD=-bash,再通过其PPID找到父进程。
常见错误
-
混淆
ps aux和ps -aux:这是最常见的困惑。在ps命令中,aux是一个参数组合(没有短横线)。如果你写成ps -aux,它会被解析为显示所有用户(-a)的进程,并且这些进程还必须关联一个排除(-x)的终端(-u后面需要跟用户名),这通常不是你想要的结果。结论:查看所有进程请用ps aux或ps -ef。 -
信息过载,不知如何阅读:
ps aux输出的信息列很多,让人眼花缭乱。初学者应先聚焦于USER,PID,%CPU,%MEM,STAT,COMMAND这几列,其他列在深入学习时再了解。 -
认为
ps是实时更新的:ps显示的是命令执行那一瞬间的进程快照。如果你要持续监控进程的动态变化(如CPU使用率),应该使用top或htop命令(下一课内容)。
小结
本节课我们学习了 Linux 中查看进程的基石工具——ps 命令。关键要点如下:
ps的作用:获取系统中进程的静态快照,是排查问题和监控系统的基础。- 常用命令组合:
ps aux:查看所有用户的所有进程详细信息(BSD风格,最常用)。ps -ef:查看所有进程并显示父子关系(UNIX风格)。ps aux | grep 关键词:在进程列表中搜索特定进程。
- 解读输出:学会看
PID(身份)、USER(归属)、STAT(状态)、%CPU/%MEM(资源占用)和COMMAND(命令)。 - 核心技巧:
ps命令通常需要与grep、awk、sort等其他工具结合使用,才能发挥最大威力。
掌握了 ps,你就能随时洞察系统内部运行的程序。下一课,我们将学习 top 和 htop,看看如何对进程进行动态的实时监控。