第42集:进程查看命令

章节标题

进程查看命令

核心知识点讲解

ps 命令

ps(Process Status)命令是最基本的进程查看命令,用于显示当前系统中的进程信息。

基本用法

# 显示当前终端相关的进程
ps

# 显示所有进程
ps aux

# 以BSD风格显示所有进程
ps axjf

常用选项

选项 描述
a 显示所有终端的进程
u 以用户为中心的格式显示
x 显示无终端的进程
e 显示所有进程,包括无终端的
f 显示进程树结构
j 以作业控制格式显示
l 以长格式显示
o 自定义输出格式
p 显示指定PID的进程
t 显示指定终端的进程
--sort 按指定字段排序

输出字段解释

字段 描述
PID 进程ID
PPID 父进程ID
USER 进程所有者
%CPU CPU使用率
%MEM 内存使用率
VSZ 虚拟内存大小
RSS 物理内存大小
TTY 终端类型
STAT 进程状态
START 启动时间
TIME 占用CPU时间
COMMAND 命令名称

自定义输出格式

# 自定义输出格式,显示PID、PPID、USER、COMMAND
ps -eo pid,ppid,user,command

# 显示进程ID、父进程ID、CPU使用率、内存使用率、命令
ps aux --sort=-%cpu | head -10

# 显示进程树
ps axjf

top 命令

top 命令是一个交互式的进程监控工具,用于实时显示系统中进程的资源使用情况。

基本用法

# 启动top命令
top

# 以批处理模式运行,显示指定次数后退出
top -b -n 1

# 只显示指定PID的进程
top -p PID1,PID2

交互式命令

在top运行时,可以使用以下快捷键:

快捷键 功能
q 退出top
k 终止指定进程
r 调整进程优先级
f 自定义显示字段
M 按内存使用率排序
P 按CPU使用率排序
T 按CPU时间排序
1 显示所有CPU核心的使用率
z 启用彩色显示
h 显示帮助信息

输出解释

top命令的输出分为两部分:

  1. 顶部系统摘要信息:包括系统时间、运行时间、用户数、负载平均值、CPU使用率、内存使用率等
  2. 进程列表:按默认或用户指定的排序方式显示进程信息

pgrep 命令

pgrep 命令用于根据进程名称或其他属性查找进程的PID。

基本用法

# 根据进程名称查找PID
pgrep 进程名

# 查找包含指定字符串的进程
pgrep -f 字符串

# 显示进程名称和PID
pgrep -l 进程名

# 显示完整命令行
pgrep -a 进程名

# 查找属于指定用户的进程
pgrep -u 用户名 进程名

pstree 命令

pstree 命令以树状结构显示进程之间的关系。

基本用法

# 显示进程树
pstree

# 显示PID
pstree -p

# 显示用户名
pstree -u

# 显示进程树,包含PID和用户名
pstree -pu

# 以指定进程为根显示进程树
pstree -p PID

其他进程查看命令

pidof 命令

用于查找指定进程名称的PID。

# 查找指定进程名称的PID
pidof 进程名

# 示例:查找sshd进程的PID
pidof sshd

prtstat 命令

用于显示进程的状态信息。

# 显示指定PID的进程状态
prtstat PID

psmisc 工具集

包含多个进程管理工具:

  • pstree:显示进程树
  • killall:根据进程名称终止进程
  • fuser:显示使用指定文件或端口的进程

实用案例分析

案例1:查找占用资源最多的进程

# 查找CPU使用率最高的10个进程
ps aux --sort=-%cpu | head -10

# 查找内存使用率最高的10个进程
ps aux --sort=-%mem | head -10

# 使用top命令实时查看
top

案例2:查找特定进程

# 使用pgrep查找进程
pgrep nginx

# 显示进程名称和PID
pgrep -l nginx

# 显示完整命令行
pgrep -a nginx

# 使用ps查找进程
ps aux | grep nginx

# 使用pidof查找进程
pidof nginx

案例3:查看进程树

# 显示完整的进程树
pstree

# 显示进程树,包含PID
pstree -p

# 以指定进程为根显示进程树
pstree -p $(pgrep nginx | head -1)

# 使用ps命令显示进程树
ps axjf

案例4:监控系统状态

# 实时监控系统状态
top

# 以批处理模式运行,适合脚本使用
top -b -n 1 | head -20

# 查看系统负载
uptime

# 查看内存使用情况
free -h

# 查看CPU使用情况
mpstat

案例5:进程筛选和排序

# 按CPU使用率排序
ps aux --sort=-%cpu

# 按内存使用率排序
ps aux --sort=-%mem

# 按启动时间排序
ps aux --sort=start_time

# 筛选指定用户的进程
ps -u username

# 筛选指定终端的进程
ps -t pts/0

# 自定义输出格式
ps -eo pid,ppid,user,%cpu,%mem,command --sort=-%cpu | head -10

代码示例

示例1:进程监控脚本

#!/bin/bash

# 进程监控脚本

# 显示帮助信息
show_help() {
    echo "进程监控脚本"
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  -c, --cpu <number>       显示CPU使用率最高的N个进程"
    echo "  -m, --mem <number>       显示内存使用率最高的N个进程"
    echo "  -p, --process <name>     查找指定名称的进程"
    echo "  -t, --tree               显示进程树"
    echo "  -s, --status <pid>       显示指定PID的进程状态"
    echo "  -h, --help               显示帮助信息"
}

# 解析命令行参数
CPU_TOP=0
MEM_TOP=0
PROCESS_NAME=""
SHOW_TREE=false
PROCESS_STATUS=0

while [[ $# -gt 0 ]]; do
    case $1 in
        -c|--cpu)
            CPU_TOP="$2"
            shift 2
            ;;
        -m|--mem)
            MEM_TOP="$2"
            shift 2
            ;;
        -p|--process)
            PROCESS_NAME="$2"
            shift 2
            ;;
        -t|--tree)
            SHOW_TREE=true
            shift
            ;;
        -s|--status)
            PROCESS_STATUS="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
done

# 显示CPU使用率最高的进程
if [[ $CPU_TOP -gt 0 ]]; then
    echo "=== CPU使用率最高的 $CPU_TOP 个进程 ==="
    ps aux --sort=-%cpu | head -$((CPU_TOP + 1))
    echo ""
fi

# 显示内存使用率最高的进程
if [[ $MEM_TOP -gt 0 ]]; then
    echo "=== 内存使用率最高的 $MEM_TOP 个进程 ==="
    ps aux --sort=-%mem | head -$((MEM_TOP + 1))
    echo ""
fi

# 查找指定名称的进程
if [[ -n "$PROCESS_NAME" ]]; then
    echo "=== 名称包含 '$PROCESS_NAME' 的进程 ==="
    ps aux | grep "$PROCESS_NAME" | grep -v grep
    echo ""
    
    echo "=== 使用pgrep查找 '$PROCESS_NAME' ==="
    pgrep -a "$PROCESS_NAME"
    echo ""
fi

# 显示进程树
if $SHOW_TREE; then
    echo "=== 进程树 ==="
    pstree -pu
    echo ""
fi

# 显示指定PID的进程状态
if [[ $PROCESS_STATUS -gt 0 ]]; then
    echo "=== 进程 $PROCESS_STATUS 的状态 ==="
    ps -p $PROCESS_STATUS -o pid,ppid,user,%cpu,%mem,state,command
    echo ""
    
    echo "=== 进程 $PROCESS_STATUS 的树状结构 ==="
    pstree -p $PROCESS_STATUS
    echo ""
fi

# 如果没有指定选项,显示系统概览
if [[ $CPU_TOP -eq 0 && $MEM_TOP -eq 0 && -z "$PROCESS_NAME" && ! $SHOW_TREE && $PROCESS_STATUS -eq 0 ]]; then
    echo "=== 系统概览 ==="
    uptime
    echo ""
    
    echo "=== 内存使用情况 ==="
    free -h
    echo ""
    
    echo "=== CPU使用情况 ==="
    mpstat
    echo ""
    
    echo "=== 活跃进程数 ==="
    ps aux | wc -l
    echo ""
    
    echo "=== CPU使用率最高的5个进程 ==="
    ps aux --sort=-%cpu | head -6
    echo ""
    
    echo "=== 内存使用率最高的5个进程 ==="
    ps aux --sort=-%mem | head -6
    echo ""
fi
echo "监控完成"

示例2:进程状态检查脚本

#!/bin/bash

# 进程状态检查脚本

# 检查进程是否存在
check_process() {
    local process_name="$1"
    local pid=$(pgrep -f "$process_name" | head -1)
    
    if [[ -n "$pid" ]]; then
        echo "进程 '$process_name' 存在,PID: $pid"
        return 0
    else
        echo "进程 '$process_name' 不存在"
        return 1
    fi
}

# 检查多个进程
processes=("nginx" "mysql" "ssh" "apache2")

echo "=== 进程状态检查 ==="
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""

for process in "${processes[@]}"; do
    check_process "$process"
    echo ""
done

# 检查系统负载
echo "=== 系统负载 ==="
uptime
echo ""

# 检查系统资源使用情况
echo "=== 系统资源使用情况 ==="
top -b -n 1 | head -20
echo ""

echo "检查完成"

示例3:进程统计脚本

#!/bin/bash

# 进程统计脚本

echo "=== 进程统计报告 ==="
echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""

# 总进程数
total_processes=$(ps aux | wc -l)
echo "总进程数: $((total_processes - 1))"  # 减1是因为ps命令本身也会被计数

# 按用户统计进程数
echo ""
echo "=== 按用户统计进程数 ==="
ps aux | awk '{print $1}' | sort | uniq -c | sort -nr

# 按状态统计进程数
echo ""
echo "=== 按状态统计进程数 ==="
ps aux | awk '{print $8}' | sort | uniq -c | sort -nr

# CPU使用率最高的进程
echo ""
echo "=== CPU使用率最高的5个进程 ==="
ps aux --sort=-%cpu | head -6

# 内存使用率最高的进程
echo ""
echo "=== 内存使用率最高的5个进程 ==="
ps aux --sort=-%mem | head -6

# 占用CPU时间最长的进程
echo ""
echo "=== 占用CPU时间最长的5个进程 ==="
ps aux --sort=-time | head -6

# 最年轻的进程
echo ""
echo "=== 最年轻的5个进程 ==="
ps aux --sort=start_time | tail -6

# 最老的进程
echo ""
echo "=== 最老的5个进程 ==="
ps aux --sort=-start_time | head -6

echo ""
echo "统计完成"

总结

本集介绍了 Linux 中常用的进程查看命令,包括:

  1. ps 命令:最基本的进程查看命令,支持多种显示格式和选项
  2. top 命令:交互式的进程监控工具,实时显示系统和进程状态
  3. pgrep 命令:根据进程名称或其他属性查找进程的PID
  4. pstree 命令:以树状结构显示进程之间的关系
  5. 其他进程查看命令:如 pidofprtstat

同时,本集还介绍了这些命令的常用选项、输出字段解释,以及多个实用案例和代码示例,包括:

  • 查找占用资源最多的进程
  • 查找特定进程
  • 查看进程树
  • 监控系统状态
  • 进程筛选和排序
  • 进程监控脚本
  • 进程状态检查脚本
  • 进程统计脚本

通过掌握这些进程查看命令和技巧,用户可以更好地了解系统的运行状态,监控进程的资源使用情况,及时发现和解决系统问题,从而提高系统的稳定性和性能。

« 上一篇 进程概念与状态 下一篇 » 进程监控工具