2013-03-27 23 views
2

有没有办法找出程序读取文件的位置?它似乎可以与stracedtrace可行?通过文件跟踪程序的进度?

为了澄清问题并给予动机,说我有一个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 

编辑:我很抱歉,我给的例子过于狭窄,没有切中要害。理想情况下,对于任意程序,我希望看到文件读取发生的位置(不管管道)。

+0

所以你想要窥探第三方流程的I/O?我没有看到想要监视猫进程的理由。是否有更真实的解释你真正的追求? – 2013-03-27 21:22:32

+0

这是我真实的世界的解释。我现在已经运行了这个命令大约30分钟,并且很高兴看到它通过文件所取得的进展。另一个例子:用户正在从Web服务器下载一个大文件,我如何检查上次读取的内容以确定下载进度? – erikreed 2013-03-27 21:24:56

回答

1

你可以用progresscommand做你想做的。它显示了coreutils工具的进度,如cat或其他程序在阅读他们的文件。

文件和偏移量信息可在Linux的/proc/<PID>/fd/proc/<PID>/fdinfo中找到。

+0

这很好 - 谢谢。 – erikreed 2016-06-21 03:47:48

2

相反猫:

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 
+0

真棒,这是一个很好的管道的东西。但是如果管道不可行呢?例如另一个用户正在运行一个进程,或者该程序不读取stdin。编辑:这也需要安装光伏,这可能不是所有情况下的理想选择。 – erikreed 2013-03-27 21:17:22

+0

@erikreed不知道。 – kjprice 2013-03-27 21:19:36

1

如果示例是真正的你的使用情况,那么我建议pipe viewerexample image from pv's website