私は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
他の人が指摘したように、tail
OS 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