在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