查看程序在运行过程中使用到的文件
查看程序在运行过程中使用到的文件
Table of Contents
1 场景
试想这个场景
- 写了一个脚本在运行
- 脚本运行时间需要很长,并且你不能停下脚本(会有中断问题)
- 这时候你想知道自己的脚本进程在处理什么文件,在做什么事情,该怎么办呢?
2 想知道进程在读写什么文件
首先 使用 ps aux 或者 ps ef
查看自己的进程 id
然后到 /proc/
目录中下查看相应进程的进程运行数据
ps aux
数据
wudanya+ 3166 0.0 0.0 107956 616 ? S 22:04 0:00 sleep 180 wudanya+ 3189 0.0 0.0 107956 616 pts/3 S+ 22:06 0:00 sleep 1000000 wudanya+ 3191 0.0 0.0 112728 972 pts/5 R+ 22:06 0:00 grep --color=auto sleep
第二列就是每个进程的 pid ,在系统中是唯一的
查看 /proc/[pid]/fd
目录
如图, 可以看到,进程打开了 4 个文件描述符
其中 0、1、2 分别代表 标准输入、输出、错误(规定)
25 代表的是一个虚拟终端
3 打开的是一个文件
这样就可以知道你打开的是什么文件了
是不是很简单呢
3 我怎么知道文件正在读取还是写入呢
这还用问,当然是看代码了
开个玩笑
咱们这次是说不用看代码就可以看出来在写入什么文件,在读取什么文件
3.1 lsof -p pid
[wudanyang@bogon ~]$ lsof -p 3352 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME tail 3352 wudanyang cwd DIR 253,0 4096 4731473 /home/wudanyang tail 3352 wudanyang rtd DIR 253,0 240 64 / tail 3352 wudanyang txt REG 253,0 66824 12829983 /usr/bin/tail tail 3352 wudanyang mem REG 253,0 106075056 12587626 /usr/lib/locale/locale-archive tail 3352 wudanyang mem REG 253,0 2156160 44517 /usr/lib64/libc-2.17.so tail 3352 wudanyang mem REG 253,0 163400 44510 /usr/lib64/ld-2.17.so tail 3352 wudanyang 0u CHR 136,3 0t0 6 /dev/pts/3 tail 3352 wudanyang 1u CHR 136,3 0t0 6 /dev/pts/3 tail 3352 wudanyang 2u CHR 136,3 0t0 6 /dev/pts/3 tail 3352 wudanyang 3r REG 253,0 0 5171247 /home/wudanyang/a tail 3352 wudanyang 4r a_inode 0,10 0 5338 inotify tail 3352 wudanyang 25u CHR 5,2 0t0 7061 /dev/ptmx
前三列可以不用管,第四列是打开的描述符,可以看到
FD:
u | 读/写 |
r | 只读 |
w | 只写 |
W | 获得写锁 |
OK,搞定,可以看到咱们程序打开了一个 /home/wudanyang/a
文件只读描述符
3.2 使用 strace -p pid 看一下系统调用
通过系统调用查看一下当前正在执行的系统调用,也可以看到是 读还是写。上图中是一个读取的系统调用,参数是文件描述符 4
4 总结
- 日常工作中会经常遇到这种需求,总结一下
/proc/[pid]/
不止有 fd ,可以继续深入了解一下
本文来自博客园,作者:吴丹阳-V,转载请注明原文链接:https://www.cnblogs.com/wudanyang/p/13643060.html