1. 概述
本文基于 Linux 系统环境,详细介绍进程名的查看方法、不同命令间的进程名显示差异原因,以及基于进程名的进程终止操作,解决实际使用中"进程名显示不一致""杀进程失败"等常见问题。
2. 常用进程名查看命令
Linux 提供多种工具查看进程名,核心命令包括 ps
、pgrep
、top
、htop
,各命令的适用场景与输出特点不同,具体如下:
2.1 ps
命令(静态查看)
ps
是最基础的进程静态查看工具,可通过不同选项组合获取进程名及详细信息,适用于"一次性查看进程快照"场景。
命令格式 | 功能说明 | 进程名位置 |
---|---|---|
ps aux |
显示系统所有进程的完整信息(含用户、PID、内存占用等) | 最后一列 COMMAND (进程启动命令+参数,含完整路径) |
ps -ef |
显示系统所有进程的简洁信息(含父PID、启动时间等) | 最后一列 CMD (同 COMMAND ,完整命令+参数) |
ps -p <PID> -o comm= |
查看指定 PID 的简短进程名 | 仅输出 comm 字段(截断后的简短进程名) |
示例输出(ps -ef
):
bash
UID PID PPID C STIME TTY TIME CMD
root 1234 1 0 09:00 ? 00:00:05 /usr/sbin/sshd -D # CMD列:完整命令(含路径+参数)
user 5678 1234 0 09:30 pts/0 00:00:01 ./AppBackgroundService # CMD列:自定义进程的完整启动命令
2.2 pgrep
命令(按名查PID)
pgrep
专门用于"通过进程名匹配 PID",默认仅输出 PID,加 -l
选项可同时显示"PID+进程名",适用于"快速定位目标进程PID"场景。
命令格式 | 功能说明 | 进程名来源 |
---|---|---|
pgrep <进程名关键字> |
输出匹配关键字的进程PID | 默认读取内核 comm 字段(截断后的简短进程名) |
pgrep -l <进程名关键字> |
输出"PID+进程名" | 同左,显示截断后的 comm 字段 |
pgrep -fl <进程名关键字> |
输出"PID+完整命令行" | 读取进程命令行字段(无截断,同 ps -ef 的 CMD 列) |
示例输出:
bash
# 未加-f:匹配comm字段(截断后)
pgrep -l AppBackground # 输出:5678 AppBackgroundSe(进程名截断为15字符)
# 加-f:匹配完整命令行(无截断)
pgrep -fl AppBackground # 输出:5678 ./AppBackgroundService(完整命令)
2.3 top
/htop
命令(动态监控)
top
:系统自带的实时进程监控工具,默认按 CPU 使用率排序,进程名在COMMAND
列(同ps
的CMD
列)。htop
:top
的增强版(需手动安装),界面更友好,进程名显示在右侧COMMAND
列,支持鼠标操作。
操作说明:
- 按
q
退出监控界面; - 按
P
按 CPU 使用率排序,按M
按内存使用率排序。
3. ps -ef
与 pgrep -l
进程名差异解析
3.1 核心原因:进程的两个"名称字段"
Linux 内核为每个进程维护两个关键"名称相关字段",不同命令读取的字段不同,导致显示差异:
字段名称 | 存储内容 | 长度限制 | 读取命令 |
---|---|---|---|
命令行字段(cmdline) | 进程启动时的完整命令(含路径、参数) | 无固定限制(取决于系统配置) | ps -ef 、ps aux 、pgrep -f |
进程名字段(comm) | 进程的"简短名称"(通常为可执行文件名,不含路径) | 默认15个字符(超过部分自动截断) | pgrep -l (默认)、ps -o comm |
3.2 案例分析(以 ./AppBackgroundService
为例)
- 进程启动命令 :
./AppBackgroundService
(可执行文件名AppBackgroundService
); - 名称长度计算 :
AppBackgroundService
共 20 个字符(超过 15 字符限制); - 字段存储结果 :
- 命令行字段(cmdline):完整存储
./AppBackgroundService
(无截断); - 进程名字段(comm):自动截断为前 15 个字符
AppBackgroundSe
;
- 命令行字段(cmdline):完整存储
- 命令显示差异 :
ps -ef
:读取 cmdline 字段,显示./AppBackgroundService
;pgrep -l
:默认读取 comm 字段,显示AppBackgroundSe
。
3.3 如何统一两者的显示结果
若需让 pgrep
显示与 ps -ef
一致的完整进程名,需使用 -f
选项(强制匹配命令行字段):
bash
# 显示完整命令行(与ps -ef的CMD列一致)
pgrep -fl AppBackgroundService # 输出:5678 ./AppBackgroundService
4. 基于进程名终止进程的方法
杀进程工具(如 pkill
、killall
)默认匹配的是 comm 字段(截断后的进程名),因此需根据工具的匹配规则选择正确的进程名。
4.1 常用杀进程命令
命令格式 | 匹配字段 | 适用场景 | 示例 |
---|---|---|---|
pkill <截断后的进程名> |
comm 字段 | 已知进程名被截断时 | pkill AppBackgroundSe (终止上文示例进程) |
pkill -f <完整进程名/命令> |
cmdline 字段 | 需精确匹配完整命令时 | pkill -f ./AppBackgroundService |
killall <截断后的进程名> |
comm 字段 | 终止所有同名进程 | killall AppBackgroundSe |
killall -f <完整进程名> |
cmdline 字段 | 终止所有匹配完整命令的进程 | killall -f ./AppBackgroundService |
4.2 注意事项
- 若进程名包含特殊字符(如
./
、-
),使用pkill -f
时需确保命令行匹配完整(避免误杀其他进程); - 若不确定进程名是否被截断,可先通过
ps -ef | grep <关键字>
确认完整命令,再用pkill -f <完整命令>
终止。
5. 常见问题与解决方案
常见问题 | 原因 | 解决方案 |
---|---|---|
ps -ef 显示完整路径,想只看简短进程名 |
ps -ef 默认读取 cmdline 字段 |
使用 ps -ef -o pid,comm (显示 PID+简短进程名) |
pgrep -l 显示的进程名比 ps -ef 短 |
pgrep 默认读取 comm 字段(15字符限制) |
加 -f 选项:pgrep -fl <关键字> |
用完整进程名杀进程失败(如 pkill AppBackgroundService ) |
pkill 默认匹配 comm 字段(截断后) |
方案1:用截断后的名称(pkill AppBackgroundSe );方案2:加 -f 匹配完整命令(pkill -f AppBackgroundService ) |
6. 常用命令速查表
需求场景 | 推荐命令 | 说明 |
---|---|---|
查看所有进程的完整信息(含路径) | ps aux 或 ps -ef |
静态快照,适合一次性查看 |
快速定位进程PID(已知部分名称) | pgrep -l <关键字> |
默认显示截断后的进程名 |
查看指定PID的简短进程名 | ps -p <PID> -o comm= |
排除路径和参数干扰 |
实时监控进程(含资源占用) | top 或 htop |
动态刷新,适合排查高资源占用进程 |
精确终止指定进程(已知完整命令) | pkill -f <完整命令> |
避免因进程名截断导致杀进程失败 |