ファイルが切り捨てられると、tail -f が中断されます。

ファイルが切り捨てられると、tail -f が中断されます。

私はtail -f(Mac OS X el Capitanの端末で)ファイルのリアルタイム変更(PERLスクリプトを使用してデータベースからデータをインポートした結果)を表示するために使用しています。ただし、Perlスクリプトがファイルを切り捨てて新しいデータを追加することもあります。このような状況が発生した場合は、次のメッセージが表示されます。

tail: test.txt: file truncated

これにより、ファイルの内容は表示されません。これは、ファイルを以前より少ない行に置き換えた場合にのみ発生するようです。新しい行がスクリプトを実行する前より長くなると、このエラーは発生せずにtail -f動作し続けます。実際にtail -fこの(エラー?)メッセージを受信した後、ファイルのデータが表示されないことを確認しました。

私はこのような質問を見たことがあります。tailを使用するときに「ファイルを切り捨てる」メッセージを抑制します。

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

ただし、これはメッセージを抑制するだけで、まだ中断され、短く切り捨てられたファイルの内容を表示し続けません。

リアルタイムでファイルの変更を見るためのより良いコマンドはありますか?それとも、tail -fファイルが切り捨てられたときに無視するフラグがありますか?

答え1

他の人が指摘したように、tailOS Xに付属のコマンドにはそのオプションはありません--retry。ただし、そのオプションを使用して、GNUバージョンのテールを簡単にインストールできます。GNUコアツール。たとえば、MacPortsを使用している場合sudo port install coreutils

リアルタイムでファイルを表示するための代替案は、watch残念ながらOS Xでは利用できないコマンドです。ただし、次のものを使用できます。このシンプルなソリューション

答え2

これはtail-Fスクリプトです。 1つのパラメータ、つまりtailファイルを使用します。より良いオプション(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

答え3

使用tail --f=name

-fこのフラグのデフォルト値はですdescriptor。名前に変更すると、ファイルtail名に従い、ファイルが切り捨てられても表示されます。

PS。メッセージは引き続き受信されます。tail: File truncated

答え4

次のコマンドは、ファイルが削除またはアクセスできない場合でもファイルを再試行し続けます。作成後に内容を再印刷します。

tail -F filename --retry

関連情報