有没有办法找出程序读取文件的位置? strace或dtrace似乎可能是可行的?
为了澄清问题并提供动力,例如我有一个10GB的日志文件,并计算独特的行数:
$ cat log.txt | sort | uniq | wc -l
我可以检查cat
目前在哪个文件,有效地给出命令的进展? 使用lsof
,我似乎无法得到最后一个文件读取的偏移量,我认为这将是一个诀窍:
$ lsof log.txt COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME cat 16021 erik 3r REG 0,22 13416118210 1078133219
编辑:我很抱歉,我给出的例子太狭隘,错过了一点。 理想情况下,对于一个任意的程序,我想看看在哪里读取文件(不pipepipe道)。
你可以用progress
命令做你想做的事情。 它显示了读取文件时coreutils工具(如cat
或其他程序)的进度。
文件和偏移量信息在/proc/<PID>/fd
和/proc/<PID>/fdinfo
中的Linux中可用。
而不是猫:
pv log.txt | sort | uniq | wc -l
用pv管道:
SIZE=$( ls -l log.txt | awk '{print $5}'); cat log.txt | sort | pv -s $SIZE | uniq | wc -l
如果这个例子真的是你的用例,那么我会推荐管道查看器 。