如何查看用户正在编辑的vi文件及区分同名目录下的目标文件
如何查看用户正在用vi编辑器编辑的文件?
我平时排查这类问题时,常用这几个实用方法:
- 借助
lsof命令:这是最直接高效的方式,它能列出系统中所有被打开的文件。你可以直接执行lsof | grep vi过滤出vi相关的进程和对应文件;如果要针对特定用户查询,加上-u参数更精准,比如lsof -u 目标用户名 | grep vi,结果里的NAME列就是正在编辑的文件完整路径。 - 查找vi的交换文件:vi在编辑文件时会自动生成交换文件(默认命名为
.文件名.swp),你可以用find / -name "*.swp" 2>/dev/null遍历系统查找交换文件,找到后,交换文件对应的原文件就是正在编辑的对象。不过要注意:如果用户异常退出vi,交换文件可能不会自动删除,所以最好结合进程信息一起判断。 - 用
ps+pwdx组合:先执行ps aux | grep vi找到vi进程的ID(PID)和命令行参数,命令行里通常会显示正在编辑的文件名;如果显示的是相对路径,再用pwdx 进程PID查看该进程的工作目录,把工作目录和相对文件名拼接起来,就能得到完整的绝对路径了。
执行
w命令后发现有用户正在编辑同名文件,如何确定具体是哪一个? 碰到这种多目录下存在同名文件的场景,我一般用这几个方法精准定位:
- 用
lsof查看完整路径:找到vi进程的PID后,直接执行lsof -p 进程PID,输出结果里的NAME列会显示该进程打开的所有文件,其中就包含正在编辑的文件的绝对路径,完全不用担心同名混淆。 - 进程工作目录+命令行参数:先用
ps aux | grep vi拿到进程的命令行参数(里面的文件名)和PID,再用pwdx 进程PID获取进程的当前工作目录,把这两部分拼接起来就是完整的文件路径。比如命令行显示vi app.conf,工作目录是/opt/serviceA,那对应的文件就是/opt/serviceA/app.conf。 - 通过交换文件位置反推:vi的交换文件默认和原文件在同一目录下,所以找到对应的
.swp文件后,它所在的目录就是原文件的目录。比如你找到.app.conf.swp在/etc/serviceB目录下,那用户正在编辑的就是/etc/serviceB/app.conf。
内容的提问来源于stack exchange,提问作者LINUX G33NYUS
相关产品推荐
相关产品推荐

