我有一個正在不斷更新的檔案。每次我呼叫tail file.log它都會顯示不同的結果。
我的問題是,它是如何在引擎蓋下作業的?我希望它從位元組向后讀取檔案,但同時它正在不斷更新。它如何在不損壞檔案的情況下作業,同時顯示未損壞的結果?
每次我谷歌時How does tail work for continuously updated file,我都會得到有關如何使用它進行監控的解決方案tail -f file.log,我知道它有效。
但我想知道的是它是如何作業的。
uj5u.com熱心網友回復:
在man tail每一個的搜索引擎應該將其鏈接到尾(1) ,并解釋這一點,如果你看過進一步whatfore的選項-s是。
uj5u.com熱心網友回復:
我從未讀過tail -f代碼,但我認為這并不難;唯一的事情是打開檔案后不要關閉檔案。
因此,打開檔案進行閱讀,將其讀到最后并顯示最后幾行,等待,讀到新的末尾(您已經在舊的末尾)同時顯示每一行,等等......
在 Shell 中,訣竅是使用檔案描述符在到達檔案末尾后不關閉檔案:
#!/bin/sh
exec 3< file.txt
while true
do
while IFS='' read -r line
do
printf '%s\n' "$line"
done <&3
sleep 2
done
備注:此示例顯示整個檔案內容,然后每 2 秒用添加的新行更新輸出
uj5u.com熱心網友回復:
我希望它從位元組向后讀取檔案,但同時它正在不斷更新。它如何在不損壞檔案的情況下作業,同時顯示未損壞的結果?
每個打開的檔案都有相關的檔案偏移量以開放的相關檔案描述符(見man 2 lseek,man 3 lseek并man open與維基百科檔案描述符)。
當檔案偏移(點位于檔案的末尾過去的檔案中的最后一個字符)系統呼叫,用于從檔案中讀取多個資料將“塊”(見man 3 read的)(或在殼體O_NONBLOCK將回傳零個位元組讀,但假設我們忽略了這種情況)。
該檔案描述符將被阻止讀取,直到新的資料被寫入到檔案中。行程被阻塞——所有邏輯都在內核中實作。假設內核有一個“等待”行程串列,這些行程等待檔案上的新事件。當某個其他行程將新資料寫入檔案末尾時,內核會在檔案末尾等待行程,然后內核將這些行程喚醒。
當行程被喚醒時,read()call 終于可以讀取可用資料了。read()回傳新資料,移動檔案 offset,然后該程序繼續其作業。
從多個檔案讀取時,有一個特殊的系統呼叫允許在多個檔案描述符上等待“新資料” 。見man -a select和man poll。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369244.html
上一篇:將shell引數傳遞給java
下一篇:文本可以排序兩次嗎?
