Osx

Tail -f 在文件被截斷時中斷

  • January 10, 2020

我正在使用tail -f(在 Mac OS X el capitan 上的終端​​中)查看對我的文件的實時更改(使用 PERL 腳本從數據庫中提取數據的結果)。但是,有時,Perl 腳本會截斷文件並向其中添加新數據。有時,當這種情況發生時,它會給我這樣的資訊:

tail: test.txt: file truncated

然後不顯示文件的任何內容。這似乎只在我用比以前更少的行替換文件時發生。當新行比執行腳本之前長時,我沒有收到此錯誤並且tail -f繼續工作。我已經確認,事實上,文件中的數據在tail -f收到此(錯誤?)消息後未顯示。

我見過類似的問題:Suppress ‘file truncated’ messages when using tail

tail -f test.txt 2> /dev/null

但這只會抑制消息並且仍然中斷,它不會繼續向我顯示較短的截斷文件內容。

是否有更好的命令用於實時查看文件更改?tail -f或者當文件被截斷時不關心的標誌?

正如其他人指出的那樣,tailOS X 附帶的命令沒有該--retry選項。但是,您可以簡單地安裝具有該選項的 GNU 版本的 tail;它是GNU coreutils的一部分。例如,如果您使用 MacPorts,您可以通過執行sudo port install coreutils.

實時觀看文件的替代方法是watch命令,不幸的是 OS X 也不附帶該命令。但是,您可以使用這個簡單的解決方法

這是一個tail-F腳本。它需要一個參數 - 尾文件。可能有更好的選擇(例如安裝 GNU tail),但它在這裡展示了通常可以從可用的部分建構簡單版本的工具。

#!/bin/bash
#
file="$1"
size=$(stat -c '%s' "$file" 2>/dev/null)
test -z "$size" && echo "No file '$file'" >&2

while sleep 1
do
   n_size=$(stat -c '%s' "$file" 2>/dev/null)

   if [[ -n "$n_size" ]]
   then
       if [[ 0 == "$size" ]]
       then
           # Output whole file (so far)
           dd bs=1K if="$file" 2>/dev/null
           size="$n_size"

       elif [[ "$n_size" > "${size:-0}" ]]
       then
           # Output new part of file
           dd bs="$size" skip=1 if="$file" 2>/dev/null
           size="$n_size"

       elif [[ -z "$size" ]]
       then
           echo "New file '$file'" >&2
           size=0

       elif [[ "$n_size" < "${size:-0}" ]]
       then
           echo "Rewinding file '$file'" >&2
           size=0
       fi
   fi
done

引用自:https://unix.stackexchange.com/questions/364201