在Linux系统中,进程标识符(PID)是操作系统为每个正在运行的进程分配的唯一数字编号,用于区分和管理不同进程,获取或打印PID是系统管理和脚本开发中的常见需求,本文将详细介绍Linux中打印PID的多种方法,涵盖命令行工具、系统文件及编程接口等场景。

使用基础命令行工具打印PID
ps命令:查看进程状态并提取PID
ps(Process Status)是最常用的进程查看工具,通过组合参数可以灵活获取目标进程的PID。
-
基本用法:
执行ps -ef或ps aux可列出系统中所有进程的详细信息,其中第二列即为PID(-ef格式中)或第四列(aux格式中)。ps -ef | grep nginx
输出示例:
root 1234 1 0 10:00 ? 00:00:00 nginx: master process nginx www 1235 1234 0 10:01 ? 00:00:00 nginx: worker process其中
1234和1235分别为nginx主进程和工作进程的PID。 -
常用参数组合:
-o pid:仅输出PID列,如ps -o pid -C nginx(-C指定进程名);
-o pid,cmd:输出PID及完整命令行,便于区分同名进程;
--sort -pid:按PID降序排列,如ps -eo pid --sort -pid | head -n 1查看最大PID。
pgrep命令:按进程名/属性直接获取PID
pgrep(Process Group ID)是专门为进程ID查询设计的工具,相比ps更简洁,适合脚本调用。
-
基本用法:
pgrep nginx
直接输出所有匹配
nginx的PID,多个PID以换行分隔。
-
常用参数:
-l:同时输出进程名,如pgrep -l nginx;-a:输出完整命令行,如pgrep -a nginx;-P:指定父进程PID,查找子进程,如pgrep -P 1查找init进程的子进程;-u:指定用户进程,如pgrep -u www查找用户www的进程PID。
pidof命令:通过进程名获取PID
pidof是另一个轻量级PID查询工具,用法直观,主要用于获取指定进程名的所有PID。
-
基本用法:
pidof nginx
输出所有
nginx进程的PID,空格分隔(如1234 1235)。 -
与
pgrep的区别:pidof仅支持通过进程名查询,而pgrep支持更多过滤条件(如用户、父进程等),但pidof在简单场景下更快捷。
通过/proc文件系统获取PID
Linux将进程信息存储在/proc虚拟文件系统中,每个进程对应一个以PID命名的目录(如/proc/1234),直接遍历或读取该目录可获取PID。
列出所有运行中的PID
ls /proc | grep -E '^[0-9]+$'
通过正则表达式过滤/proc下的纯数字目录,即所有有效PID。
读取特定进程的PID信息
若已知进程名,可通过/proc目录下的cmdline或status文件确认PID。

grep -l nginx /proc/*/cmdline | cut -d/ -f3
/proc/*/cmdline存储进程启动命令,grep -l匹配包含nginx的文件;cut -d/ -f3提取路径中的PID部分。
编程方式获取PID
在脚本或程序开发中,可通过系统调用或库函数获取当前进程或目标进程的PID。
Shell脚本获取当前进程PID
- 使用变量:Shell内置变量表示当前进程的PID,
echo "当前脚本PID: $$"
- 获取后台进程PID:通过获取最近一个后台执行的命令的PID,如:
sleep 100 & echo "后台进程PID: $!"
C语言获取PID
通过unistd.h中的系统调用函数获取:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("当前进程PID: %dn", getpid()); // 获取当前进程PID
printf("父进程PID: %dn", getppid()); // 获取父进程PID
return 0;
}
编译运行:gcc -o pid_example pid_example.c && ./pid_example。
Python获取PID
- 使用
os模块:import os print("当前进程PID:", os.getpid()) print("父进程PID:", os.getppid()) - 使用
psutil库(需安装:pip install psutil):import psutil print("所有nginx进程PID:", [p.pid for p in psutil.process_iter(['name']) if p.info['name'] == 'nginx'])
常用PID查询方法对比
| 方法 | 命令示例 | 输出特点 | 适用场景 |
|---|---|---|---|
ps |
ps -ef | grep nginx |
详细进程信息+PID | 交互式查看、复杂过滤 |
pgrep |
pgrep nginx |
仅PID(可扩展进程名/命令行) | 脚本调用、精确查询 |
pidof |
pidof nginx |
多个PID空格分隔 | 快速获取进程名对应PID |
/proc遍历 |
ls /proc | grep -E '^[0-9]+$' |
所有PID列表 | 批量处理、底层调试 |
| Shell变量 | echo $$ |
当前进程PID | 脚本内自身进程引用 |
相关问答FAQs
Q1: 如何查找某个命令启动的所有子进程的PID?
A: 可通过pstree查看进程树,或结合ps和pgrep查找父进程的子进程,查找PID为1234的进程的所有子进程:
ps -ef | awk -v ppid=1234 '$3 == ppid {print $2}'
或使用pgrep -P 1234,若需递归查找所有后代进程,可结合pstree:
pstree -p 1234 | grep -o '[0-9]+' | grep -v 1234
Q2: 为什么用ps -ef | grep nginx有时会显示grep本身的PID?
A: grep nginx命令本身也是一个进程,当ps输出包含grep时,grep会匹配自身,导致结果中出现grep的PID,解决方法是通过grep -v排除grep进程:
ps -ef | grep nginx | grep -v grep
或使用pgrep(默认不包含自身):
pgrep nginx
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/23498.html