Linux ps 指令

Linux ps 指令

ps(Process Status)是 Linux 系统中用于查看进程状态的核心命令行工具。它提供系统当前运行进程的快照,显示进程 ID、CPU 和内存使用情况、运行状态等信息。作为系统管理员或开发人员,ps 是监控系统资源、排查性能问题和管理系统进程的必备工具。其灵活的选项和输出格式使其适用于从简单查询到复杂分析的各种场景。


什么是 ps 指令?

概述

ps 是一个经典的 Linux/Unix 命令,用于显示系统中运行进程的详细信息。它从 /proc 文件系统(虚拟文件系统,反映内核状态)获取数据,呈现进程的 PID(进程 ID)、用户、CPU 和内存占用、运行时间等。ps 支持多种输出格式(BSD、UNIX/System V)和丰富的选项,允许用户自定义显示内容,是系统监控和管理的核心工具。

核心特点

  • 进程快照:提供当前进程的实时状态。
  • 灵活输出:支持自定义字段,如 PID、用户、命令名等。
  • 多标准支持:兼容 BSD 和 UNIX 风格选项。
  • 过滤功能:可按用户、PID、状态等筛选进程。
  • 广泛适用:适合资源监控、故障排查和脚本自动化。

基本语法

ps [选项]
常用选项(UNIX 风格,带 -
  • -e:显示所有进程(包括其他用户的)。
  • -f:完整格式输出,显示更多字段。
  • -u:按指定用户过滤进程。
  • -p:按 PID 选择进程。
  • -C:按命令名过滤进程。
  • -o:自定义输出字段。
常用选项(BSD 风格,无 -
  • aux:显示所有用户的进程(a)、包含无终端进程(x)、详细输出(u)。
  • ax:显示所有进程,包括无终端的进程。

注意事项

  • 权限要求:查看其他用户进程或详细状态可能需要 root 权限(使用 sudo)。
  • 输出差异:UNIX 和 BSD 风格选项语法不同,需注意兼容性。
  • 动态性ps 提供快照,需结合 tophtop 实时监控。
  • 环境支持ps 通常预装于 Linux 发行版(如 Ubuntu、CentOS)。

ps 的常见用途

应用场景

  • 进程监控:查看系统运行的进程及其状态。
  • 资源分析:检查 CPU 和内存占用,识别高负载进程。
  • 故障排查:定位挂起或异常进程。
  • 用户管理:列出特定用户的进程。
  • 脚本自动化:结合脚本批量管理进程。

️ 基础用法与示例

准备工作

以下示例假设运行在 Linux 系统(如 Ubuntu 22.04 或 CentOS 8)。为确保清晰,输出字段将详细解释。

示例 1:显示当前用户的进程

ps
解释
  • 默认显示当前用户的终端进程。
输出示例
  PID TTY          TIME CMD
 1234 pts/0    00:00:00 bash
 5678 pts/0    00:00:01 ps
字段说明
  • PID:进程 ID。
  • TTY:控制终端。
  • TIME:累计 CPU 时间。
  • CMD:命令名。

示例 2:显示所有进程

ps -e
解释
  • -e:显示所有进程,包括系统进程。
输出示例
  PID TTY          TIME CMD
    1 ?        00:00:02 systemd
    2 ?        00:00:00 kthreadd
 1234 pts/0    00:00:00 bash

示例 3:完整格式输出

ps -ef
解释
  • -e:显示所有进程。
  • -f:完整格式,包含更多字段。
输出示例
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 04:06 ?        00:00:02 /lib/systemd/systemd
user      1234  1200  0 04:06 pts/0    00:00:00 bash
user      5678  1234  0 04:06 pts/0    00:00:01 ps -ef
字段说明
  • UID:运行进程的用户。
  • PPID:父进程 ID。
  • C:CPU 利用率。
  • STIME:启动时间。

示例 4:按用户过滤

ps -u user
解释
  • -u user:显示用户 user 的所有进程。
输出示例
  PID TTY          TIME CMD
 1234 pts/0    00:00:00 bash
 1300 pts/0    00:00:01 vim

示例 5:按 PID 查找

ps -p 1234
解释
  • -p 1234:显示 PID 为 1234 的进程。
输出示例
  PID TTY          TIME CMD
 1234 pts/0    00:00:00 bash

示例 6:BSD 风格输出

ps aux
解释
  • a:显示所有用户的进程。
  • u:用户导向的详细输出。
  • x:包含无终端的进程。
输出示例
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 123456  7890 ?        Ss   04:06   0:02 /lib/systemd/systemd
user      1234  0.0  0.2  45678  9012 pts/0    Ss   04:06   0:00 bash
字段说明
  • %CPU:CPU 使用百分比。
  • %MEM:内存使用百分比。
  • VSZ:虚拟内存大小(KB)。
  • RSS:实际内存使用(KB)。
  • STAT:进程状态(如 Ss、R、Z)。

高级用法

概述

ps 提供多种高级功能,适合复杂监控和分析场景。以下是具体用法。

️ 1. 自定义输出字段

ps -eo pid,user,%cpu,%mem,comm
解释
  • -e:显示所有进程。
  • -o:自定义输出,指定字段。
输出示例
  PID USER     %CPU %MEM COMMAND
    1 root      0.0  0.1 systemd
 1234 user      0.0  0.2 bash
常用字段
  • pid:进程 ID。
  • ppid:父进程 ID。
  • start:启动时间。
  • etime:运行时间。
  • args:完整命令行。

2. 按命令名过滤

ps -C sshd
解释
  • -C sshd:显示命令名为 sshd 的进程。
输出示例
  PID TTY          TIME CMD
  567 ?        00:00:01 sshd

3. 排序进程

ps aux --sort=-%cpu
解释
  • --sort=-%cpu:按 CPU 使用降序排序(- 表示降序)。
  • 按内存排序:--sort=-%mem
输出示例
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user      8901  5.2  2.1 987654 34567 pts/0    R    04:06   0:10 firefox
root         1  0.0  0.1 123456  7890 ?        Ss   04:06   0:02 systemd

⚡ 4. 显示进程树

ps -e --forest
解释
  • --forest:以树形结构显示进程关系。
输出示例
  PID TTY          TIME CMD
    1 ?        00:00:02 systemd
    2 ?        00:00:00  kthreadd
    3 ?        00:00:00   ksoftirqd/0
 1234 pts/0    00:00:00 bash
 1300 pts/0    00:00:01  vim
用途
  • 识别父子进程关系。

5. 结合用户和状态过滤

ps -u user -o pid,%cpu,%mem,stat | grep R
解释
  • -u user:过滤用户 user 的进程。
  • -o:自定义输出字段。
  • grep R:过滤运行状态(R = running)的进程。
输出示例
  PID %CPU %MEM STAT
 8901  5.2  2.1 R

⚠️ 使用 ps 时的注意事项

关键提示

  • 权限要求:查看其他用户进程或详细状态需 root 权限。
  • 输出格式:UNIX(带 -)和 BSD(无 -)选项不完全兼容,需正确选择。
  • 快照限制ps 显示静态快照,动态监控需用 tophtop
  • 字段选择:默认输出字段有限,需用 -o 定制关键信息。
  • 进程状态:理解状态码:
    • S:睡眠。
    • R:运行。
    • Z:僵尸。
  • 性能影响:频繁查询大量进程可能增加系统负载。

高级技巧与实战案例

概述

以下是高级技巧和实战案例,展示 ps 的强大功能。

️ 案例 1:监控高 CPU 进程

ps aux --sort=-%cpu | head -n 5
解释
  • --sort=-%cpu:按 CPU 使用降序排序。
  • head -n 5:显示前 5 个进程。
输出示例
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user      8901  5.2  2.1 987654 34567 pts/0    R    04:06   0:10 firefox
user      9000  2.1  1.5 456789 23456 ?        S    04:06   0:05 chrome
用途
  • 识别高负载进程。

案例 2:查找僵尸进程

ps -e -o pid,stat | grep Z
解释
  • -o pid,stat:显示 PID 和状态。
  • grep Z:过滤状态为 Z(僵尸)的进程。
输出示例
  PID STAT
 9999 Z
解决方法
  • 杀死父进程:

    ps -o ppid= -p 9999 | xargs kill -9
    

案例 3:监控特定服务

ps -C sshd -o pid,user,%cpu,%mem,start,time
解释
  • -C sshd:过滤命令名为 sshd 的进程。
  • -o:自定义输出字段。
输出示例
  PID USER     %CPU %MEM START   TIME
  567 root      0.0  0.1 04:06   00:00:01

案例 4:统计进程数量

ps -e | wc -l
解释
  • -e:列出所有进程。
  • wc -l:统计行数(进程数量)。
输出示例
123

案例 5:自动化监控脚本

#!/bin/bash
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "Process Status at $TIMESTAMP" >> /var/log/process.log
ps aux --sort=-%cpu | head -n 10 >> /var/log/process.log
添加到 cron
sudo crontab -e
添加内容
*/5 * * * * /path/to/script.sh
解释
  • 每 5 分钟记录 CPU 使用最高的 10 个进程。
  • 适合长期监控系统负载。

结合其他工具

概述

ps 常与其他工具结合,增强功能。

grep 结合

ps -ef | grep sshd
解释
  • 过滤 sshd 相关进程。

awk 结合

ps -ef | awk '{print $2, $1, $8}'
解释
  • 提取 PID、用户和命令。

top 结合

top
ps -p $(pidof firefox) -o pid,%cpu,%mem
解释
  • top 实时监控,ps 查看具体进程。

kill 结合

ps aux --sort=-%cpu | head -n 2 | awk 'NR==2 {print $2}' | xargs kill -9
解释
  • 杀死 CPU 使用最高的进程。

总结

ps 是 Linux 系统中查看和管理进程的核心工具,提供进程 ID、资源使用和状态等详细信息。文中从基础用法到高级技巧,结合具体示例和注意事项,全面介绍了 ps 的功能。无论是资源监控、故障排查还是自动化管理,ps 都能提供强大支持。

更多技术分享,关注公众号:halugin

你可能感兴趣的:(Linux指令,linux,运维)