Osx
Tail -f 在文件被截斷時中斷
我正在使用
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
或者當文件被截斷時不關心的標誌?
正如其他人指出的那樣,
tail
OS X 附帶的命令沒有該--retry
選項。但是,您可以簡單地安裝具有該選項的 GNU 版本的 tail;它是GNU coreutils的一部分。例如,如果您使用 MacPorts,您可以通過執行sudo port install coreutils
.實時觀看文件的替代方法是
watch
命令,不幸的是 OS X 也不附帶該命令。但是,您可以使用這個簡單的解決方法。
這是一個
tail-F
腳本。它需要一個參數 - 尾文件。可能有更好的選擇(例如安裝 GNUtail
),但它在這裡展示了通常可以從可用的部分建構簡單版本的工具。#!/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