Linux下查看进程的执行文件绝对路径

本文介绍了一个bash脚本,用于通过Linux的/proc文件系统监控特定进程的详细信息,包括执行命令、工作目录及环境变量等。此脚本帮助系统管理员和开发者更有效地管理和调试运行中的进程。
  • Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
  • /proc/N pid为N的进程信息
  • /proc/N/cmdline 进程启动命令
  • /proc/N/cwd 链接到进程当前工作目录
  • /proc/N/environ 进程环境变量列表
  • /proc/N/exe 链接到进程的执行命令文件
  • /proc/N/fd 包含进程相关的所有的文件描述符
  • /proc/N/maps 与进程相关的内存映射信息
  • /proc/N/mem 指代进程持有的内存,不可读
  • /proc/N/root 链接到进程的根目录
  • /proc/N/stat 进程的状态
  • /proc/N/statm 进程使用的内存的状态
  • /proc/N/status 进程状态信息,比stat/statm更具可读性
#!/bin/bash                                                                                                                                                                 

RES_COLOR="\E[0m"                                                                                                                                                           
RED_COLOR="\E[1;31m"                                                                                                                                                        
GREEN_COLOR="\E[1;32m"                                                                                                                                                      
YELOW_COLOR="\E[1;33m"                                                                                                                                                      
BLUE_COLOR="\E[1;34m"                                                                                                                                                       
PINK_COLOR="\E[1;35m"                                                                                                                                                       

if [ $# -ne 1 ] ; then                                                                                                                                                      
        echo -e ${RED_COLOR} "Usage: pwatch exe" ${RES_COLOR}                                                                                                               
        exit 1                                                                                                                                                              
fi                                                                                                                                                                          

for pid in `ps aux | grep $1 | awk '{print $2}'` ;                                                                                                                          
do                                                                                                                                                                          
        if [ -d "/proc/${pid}" ]; then                                                                                                                                      
                echo -ne "${pid} "                                                                                                                                          
                # echo -e ${BLUE_COLOR} `cat -v /proc/${pid}/cmdline` ${RES_COLOR}                                                                                          
                echo -e ${BLUE_COLOR} `ps aux | awk '{if($2=="'${pid}'") for(i=11;i<=NF;i++) printf("%s ", $i)}'` ${RES_COLOR}                                              
                echo -e ${GREEN_COLOR} EXE: `ls -l /proc/${pid}/exe 2>/dev/null | awk '{print $NF}'` ${RES_COLOR}                                                           
                echo -e ${GREEN_COLOR} PWD: `ls -l /proc/${pid}/cwd 2>/dev/null | awk '{print $NF}'` ${RES_COLOR}                                                           
        fi                                                                                                                                                                  
done 

➜ ~ ./pwatch.sh vim
27609 vim log.cpp
EXE: /usr/bin/vim
PWD: /home/service/common
35772 vim worker.cpp
EXE: /usr/bin/vim
PWD: /home/service/app/src

<think>好的,用户现在问的是如何在Linux中查询文件绝对路径。首先,我需要确定用户的需求是什么。可能他们是在管理服务器或者进行脚本编写时需要获取文件的完整路径,或者他们在使用某些命令时需要绝对路径来确保准确性。 接下来,我需要回顾一下常用的Linux命令。最常见的应该是`pwd`,但`pwd`主要是显示当前工作目录的绝对路径,而不是特定文件的路径。所以可能需要其他命令结合使用。比如,`readlink`命令可以用来解析符号链接并显示绝对路径,`realpath`也是一个直接获取绝对路径的工具。此外,`find`命令可以在文件系统中搜索文件并显示其路径,不过可能需要指定搜索的起始目录。`ls`命令结合选项比如`-l`可能会显示符号链接的目标路径,但可能不够直接。 然后,我需要考虑用户可能的使用场景。例如,如果他们知道文件在当前目录下,可以用`readlink -f`或者`realpath`直接获取绝对路径。如果文件在系统其他地方,可能需要用`find`从根目录开始搜索,但这样可能效率较低,或者使用`locate`命令,如果数据库是最新的,可能会更快。不过,用户可能没有安装`mlocate`,所以需要提醒他们先更新数据库。 还要考虑用户可能遇到的问题,比如权限不足导致无法访问某些目录,或者如何处理符号链接。比如`readlink -f`会自动解析所有符号链接,而`realpath`默认也会,但可能有不同的选项。另外,`find`命令的输出可能包含多个结果,需要用户确认正确的文件。 可能需要给出具体例子,让用户更容易理解。比如,使用`readlink -f example.txt`,如果文件在当前目录下,就会显示完整路径。或者用`find /home -name "target.txt" -type f`来搜索特定文件。 另外,用户可能需要知道如何显示当前目录的绝对路径,这时候`pwd`就足够了,但如果需要某个特定文件的路径,就需要其他方法。要区分这两种情况,避免混淆。 还要注意命令的可用性,比如在某些简化版的Linux发行版中,可能没有`realpath`或者`readlink`,这时候可能需要安装其他工具,或者使用组合命令,比如`cd`结合`pwd`,比如`echo $(cd $(dirname 文件名) && pwd)/$(basename 文件名)`,这种方法虽然复杂,但兼容性更好。 最后,总结常用方法,给出不同场景下的推荐命令,帮助用户根据具体情况选择最合适的方法。同时提醒用户注意事项,比如权限问题、符号链接处理等,确保他们能够正确使用这些命令。</think>以下是Linux中查询文件**绝对路径**的常用方法,按场景分类说明: --- ### **1. 已知文件在当前目录** #### **方法① `readlink`命令(推荐)** ```bash $ readlink -f 文件名 # 解析符号链接并显示绝对路径 ``` **示例**: ```bash $ readlink -f example.txt /home/user/docs/example.txt ``` #### **方法② `realpath`命令** ```bash $ realpath 文件名 # 直接输出绝对路径 ``` --- ### **2. 查找系统中任意文件** #### **方法① `find`命令(精确搜索)** ```bash $ find / -type f -name "目标文件名" 2>/dev/null # 从根目录搜索(需root权限) $ find /home -name "*.conf" # 在/home目录下搜索.conf文件 ``` **说明**: - `2>/dev/null`:忽略权限错误提示 - `-type f`:限定为普通文件 #### **方法② `locate`命令(快速搜索,需先更新数据库)** ```bash $ sudo updatedb # 更新数据库(首次使用前执行) $ locate 文件名 # 显示所有匹配路径 ``` --- ### **3. 获取正在使用的文件路径** #### **方法① `pwd`结合路径(适用于当前打开的文件)** ```bash $ echo $(pwd)/文件名 # 拼接当前目录路径 ``` #### **方法② 查看进程打开的文件路径** ```bash $ lsof -p 进程PID # 显示进程使用的所有文件路径 $ pidof 进程名 | xargs lsof -p # 根据进程名查找 ``` --- ### **4. 特殊场景处理** #### **符号链接文件路径** ```bash $ readlink -f 符号链接文件 # 显示原始文件绝对路径 ``` #### **命令所在路径** ```bash $ which 命令名 # 显示命令的安装路径(如:which python) $ whereis 命令名 # 显示命令及相关文件的路径 ``` --- ### **5. 命令对比表** | 命令/方法 | 适用场景 | 特点 | |-----------------|----------------------------|-------------------------------| | `readlink -f` | 快速获取已知文件绝对路径 | 自动解析符号链接 | | `find` | 全盘搜索不确定位置的文件 | 精确但速度慢,需权限 | | `locate` | 快速模糊搜索文件 | 依赖数据库,需定期更新 | | `lsof` | 查看进程关联文件路径 | 需知道进程PID或名称 | --- ### **6. 注意事项** 1. **权限问题**:搜索系统文件可能需要`sudo`提权 2. **符号链接**:使用`ls -l 文件`可查看链接指向的真实路径 3. **性能优化**:全盘搜索时尽量缩小范围(如指定`/var`而非`/`) --- 掌握这些方法后,您可以根据具体需求选择最合适的路径查询方式。推荐优先使用`readlink -f`或`realpath`处理已知文件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值