2013-03-27 70 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