在Linux系统中,进程号(PID,Process ID)是操作系统中用于唯一标识每个进程的数字,管理进程、调试程序、监控系统资源时,都需要准确获取进程号,Linux提供了多种命令查看进程号,不同命令适用于不同场景,下面详细介绍这些方法及其实际应用。

使用ps命令查看静态进程列表
ps(Process Status)是最基础、最常用的进程查看命令,用于显示当前运行的进程信息,包括进程号,默认情况下,ps仅显示当前终端下的进程,结合不同选项可查看所有进程或筛选特定进程。
常用选项及示例
-
ps aux:以BSD格式显示所有进程的详细信息,包括用户、PID、CPU占用率、内存占用率、启动时间、命令等。ps aux
输出示例(部分):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 12800 8364 ? Ss 09:30 0:02 /sbin/init splash root 2 0.0 0.0 0 0 ? S 09:30 0:00 kthreadd root 1234 0.1 0.3 89424 27364 ? Sl 09:31 0:05 /usr/lib/firefox/firefox其中第二列
PID即为进程号,可通过grep进一步筛选,如查看nginx进程的PID:ps aux | grep nginx
-
ps -ef:以System V格式显示所有进程,输出字段包括UID、PID、PPID(父进程ID)、C(CPU占用)、STIME(启动时间)、TTY(终端)、TIME(累计CPU时间)、CMD(命令)。ps -ef
输出示例(部分):
UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:30 ? 00:00:02 /sbin/init splash root 2 0 0 09:30 ? 00:00:00 [kthreadd] root 1234 1 0 09:31 ? 00:00:05 /usr/lib/firefox/firefox与
ps aux不同,ps -ef的PPID字段可帮助分析进程父子关系,适合排查进程启动链。 -
自定义输出字段:通过
-o选项指定需要显示的字段,仅获取PID时更简洁。ps -o pid,comm # 显示PID和命令名 ps -o pid,user,cmd # 显示PID、用户和完整命令
ps命令常用选项总结
| 选项 | 说明 |
|---|---|
a |
显示所有终端下的进程(包括其他用户) |
u |
以用户为中心显示进程(包含用户、CPU/内存占用) |
x |
显示无终端控制的进程(如后台服务) |
-e |
显示所有进程(等同于ax) |
-f |
以完整格式显示进程(包含PPID、STIME等) |
-o pid,comm |
仅显示PID和命令名 |
使用pgrep命令高效筛选进程号
pgrep(Process ID Grep)是专门用于根据进程属性筛选PID的工具,比ps | grep更高效,直接输出符合条件的PID(默认每行一个)。
常用选项及示例
-
按进程名筛选:最常用场景,直接匹配进程名(不区分大小写)。
pgrep nginx # 输出nginx进程的所有PID
若需显示进程名,加
-l选项:
pgrep -l nginx
-
按用户筛选:通过
-u选项指定用户名或UID,查看特定用户的进程。pgrep -u root # 查看root用户的进程PID pgrep -u 1000 # 查看UID为1000的进程PID
-
按父进程筛选:通过
-P选项指定父进程ID(PPID),查找子进程。pgrep -P 1 # 查找父进程为PID=1的子进程(通常是系统关键进程)
-
完整命令匹配:通过
-f选项匹配完整命令行(含参数),适合筛选带特定参数的进程。pgrep -f "nginx -g daemon" # 匹配命令中包含"nginx -g daemon"的进程
-
反向筛选:通过
-v排除符合条件的过程,如查找非root用户的进程:pgrep -v -u root
pgrep命令优势
- 输出简洁:默认仅输出PID,适合脚本调用(如
kill $(pgrep nginx)批量结束进程)。 - 筛选灵活:支持按进程名、用户、终端、父进程等多维度筛选,避免
grep的额外干扰(如grep进程本身可能出现在结果中)。
使用pidof命令快速获取进程名对应的PID
pidof是专门通过进程名获取PID的工具,比pgrep更简单,仅支持进程名匹配(不支持参数或用户筛选),适合快速查找单一进程的PID。
基本用法
pidof nginx # 输出nginx进程的所有PID(空格分隔) pidof -s nginx # 仅输出第一个匹配的PID(-s=single) pidof -o pid1 nginx # 排除PID为1的nginx进程(-o=omit,常用于排除init进程)
示例输出:
1234 1235 1236 # nginx进程的多个PID
注意:pidof仅匹配进程名,若进程名包含参数(如nginx -c /etc/nginx/nginx.conf),则无法匹配,此时需用pgrep -f。
动态监控进程号:top与htop
top和htop是交互式进程监控工具,可实时查看进程列表及资源占用,支持动态排序、筛选,适合监控进程状态变化。
top命令
默认按CPU占用率降序排列,PID位于第二列(默认显示字段)。
- 常用交互操作:
P:按CPU占用率排序(默认)M:按内存占用率排序k:输入PID后终止进程c:切换命令名/完整命令行显示q:退出top
htop命令
htop是top的增强版,界面更友好(彩色显示、树状视图、支持鼠标操作),默认显示PID列,且可通过快捷键快速筛选:
F3:搜索进程名(实时过滤)F4:按用户/命令筛选t:切换树状视图(显示父子进程关系)- /:展开/折叠进程树
动态监控场景
top -p 1234 # 仅监控PID=1234的进程(适合跟踪特定进程) htop --sort-key=MEM # 按内存占用率初始排序
通过文件描述符或端口关联进程号
若需通过“打开的文件”或“监听端口”查找进程号,可使用lsof(List Open Files)命令。

查看监听端口的进程号
lsof -i :80 # 查看80端口监听进程的PID
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 root 6u IPv6 12345 0t0 TCP *:http (LISTEN) nginx 1235 www-data 6u IPv6 12345 0t0 TCP *:http (LISTEN)
其中PID列即为进程号。
查看打开特定文件的进程
lsof /var/log/nginx/access.log # 查看打开该日志文件的进程PID
查看系统服务进程号(systemd)
对于使用systemd管理的系统服务(如Ubuntu 16.04+、CentOS 7+),可通过systemctl命令查看服务的PID。
基本用法
systemctl status nginx.service # 查看nginx服务状态,包含Main PID
输出示例(关键部分):
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2023-10-01 09:31:00 CST; 1h 30min ago
Main PID: 1234 (nginx) # 此处即为主进程PID
Tasks: 2 (limit: 1137)
Memory: 5.4M
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx -g daemon on
└─1235 nginx: worker process
若需仅获取PID,可结合grep提取Main PID:
systemctl status nginx.service | grep "Main PID" | awk '{print $3}'
相关问答FAQs
Q1:如何根据端口号查找对应的进程号?
A:可通过lsof或netstat/ss命令实现。
- 使用
lsof(推荐):lsof -i :端口号,例如lsof -i :3306查看MySQL端口对应的进程。 - 使用
ss(netstat替代工具):ss -tunlp | grep :端口号,例如ss -tunlp | grep :80查看80端口监听进程。 - 使用
netstat(传统工具):netstat -tunlp | grep :端口号(需安装net-tools包)。
Q2:为什么ps aux和ps -ef输出的PID列表不同?
A:两者输出的PID列表本质上是相同的(均包含系统所有进程),但输出格式和字段顺序不同,可能导致视觉差异:
ps aux采用BSD格式,字段顺序为:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,其中STAT列显示进程状态(如S=休眠、R=运行)。ps -ef采用System V格式,字段顺序为:UID PID PPID C STIME TTY TIME CMD,包含PPID(父进程ID)字段,便于分析进程层级。
若需对比PID是否一致,可提取PID列单独查看:ps aux | awk '{print $2}' | sort # ps aux的PID列(第2列) ps -ef | awk '{print $3}' | sort # ps -ef的PID列(第3列)两者输出的PID集合完全相同,仅显示方式和附加信息有差异。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/30488.html