命令是干什么的
pwdx 打印指定进程的当前工作目录,也就是这个进程解析相对路径时使用的基准目录。实现上读的是 /proc/进程号/cwd 这个符号链接,所以不用登录进程所属的容器或切换用户也能看到。排查中很实用:服务写出的文件跑到了意外目录、脚本里的相对路径基准不对、systemd 托管服务的工作目录和预期不同,都可以先用 pwdx 一眼定位。
基本信息
| 适用平台 | Linux,procps-ng 提供的 pwdx,主流发行版默认自带 |
|---|---|
| 语法 | pwdx 进程号 进程号,支持一次查询多个 |
| 等价写法 | readlink /proc/进程号/cwd,或 ls -l /proc/进程号/cwd |
| 输出格式 | 进程号、冒号、空格、工作目录路径 |
| 权限要求 | 查其他用户的进程需要 root,并受 ptrace 权限限制影响 |
| 易混淆项 | 可执行文件位置看 /proc/进程号/exe,两者含义不同 |
典型使用场景
- 服务输出的文件跑到了意外目录,先确认进程的工作目录到底是什么
- 排查脚本里相对路径不生效,看进程实际以哪个目录为基准解析
- 核对 systemd 托管服务的工作目录,判断是否需要指定工作目录
- 目录被删除后服务出现异常,通过链接上的删除标记快速确认
- 批量巡检:按进程名找出某类服务各自运行在哪个目录
- 交接与审计:确认服务不是从临时目录或家目录启动的
常用示例
常用示例
pwdx 1234 # 查看 1234 号进程的当前工作目录
pwdx 1234 5678 # 一次查询多个进程
pwdx $$ # 查看当前 shell 自己的工作目录
for p in $(pgrep -f 'python app.py'); do pwdx "$p"; done # 批量查看某类进程
ls -l /proc/1234/cwd # 等价写法:直接看符号链接的指向
readlink /proc/1234/cwd # 只取路径,脚本里最常用
sudo pwdx 1234 # 查其他用户的进程需要提权
lsof -a -p 1234 -d cwd # 从已打开文件的视角看同一个信息常见输出逐类读法
| 现象 | 含义 | 处理方向 |
|---|---|---|
| 1234: /var/lib/app | 正常,工作目录存在 | 继续按其他线索排查 |
| 路径带删除标记后缀 | 工作目录已被删除,进程仍持有已删除的目录对象 | 空间不会释放,重启进程或改用固定目录 |
| 输出只有一个斜杠 | 进程从根目录启动 | systemd 服务默认工作目录通常是根目录,可在单元里指定工作目录 |
| Permission denied | 权限不足,通常是查了别的用户的进程 | 用 root 执行,或确认 ptrace 相关限制 |
| No such process | 进程号不存在或进程已退出 | 用 pgrep 按进程名重新定位 |
工作目录只说明相对路径的基准,不代表程序本体所在的位置。要确认可执行文件用 /proc/进程号/exe,要确认监听端口用 ss,几个问题分开查,别用一个命令解决所有疑问。
目录被删除后符号链接会带删除标记,此时进程仍持有已删除目录的对象,占用的空间不会释放,处理办法是重启进程或让它切换到别的目录。
查其他用户的进程会受内核 ptrace 权限限制,普通用户一般只能看自己的进程,需要 root 或具备相应能力才看得到。