最直接的方式是使用特殊变量 $$,它始终保存当前 shell 进程(即脚本或交互式 shell 本身)的 pid,用于日志记录、临时文件命名、进程锁判断等,且在子 shell 中保持不变。

在 Linux Shell 中,获取当前进程的 PID 号最直接的方式是使用特殊变量 $$。
使用 $$ 获取当前 Shell 进程的 PID
$$ 是 Bash 和大多数 POSIX 兼容 Shell 提供的内置变量,它始终保存当前 Shell 进程(即脚本或交互式 Shell 本身)的 PID。
- 在脚本中直接引用:
echo $$ - 可用于日志记录、临时文件命名、进程锁判断等场景
- 注意:它不会随子 Shell 改变 —— 即使在
(...)子 shell 或管道中,$$ 仍返回原始 Shell 的 PID
区分 $$ 和 $!、$BASHPID
容易混淆的几个相关变量:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
$!:上一个后台运行命令的 PID(例如
sleep 10 &后的echo $!) -
$BASHPID(Bash 特有):当前 Bash 进程的实际 PID,进入子 shell 时会变化(如
(echo $BASHPID)输出不同值) - $$ 始终不变,代表“启动该脚本/Shell 的原始进程”
实际用法示例
比如写一个简单守护脚本,需要记录自己的 PID:
#!/bin/bash PID_FILE="/tmp/myscript.pid" echo $$ > "$PID_FILE" echo "Started with PID: $$" # ... 主逻辑 trap 'rm -f "$PID_FILE"; exit' EXIT
这样其他程序可通过读取 /tmp/myscript.pid 判断是否已在运行。
获取当前执行脚本的 PID?其实还是 $$
Shell 脚本本身就是由一个新 Shell 进程加载执行的,因此脚本内 $$ 就是该脚本进程的 PID。不需要额外调用 ps 或 pgrep —— 那样既低效又可能出错(比如匹配到其他同名进程)。










