查看程序在運行過程中使用到的文件
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 ,可以繼續深入了解一下