
新しい空のファイルでローテーションしたり、古いファイルを削除 (またはアーカイブ) したりせずに、ログ ファイルのファイル サイズを固定する方法はありますか。たとえば、ログ ファイルの最大サイズを 1 MB に設定した場合、ファイル サイズがその制限を超えると自動的にクランプされ、テキストが「末尾」に追加され、テキストの最も古い部分がポップアウトされて、ファイル サイズが 1 MB に維持されます。
答え1
これを行うには、小さな bash スクリプトを書くことができます。 を使用して、ファイルを特定のバイト数まで追跡し、tail -c
ファイルを上書きするだけです。
からman tail
:
-c, --bytes=N
output the last N bytes; alternatively, use +N to output bytes
starting with the Nth of each file
If the first character of N (the number of bytes or lines) is a `+',
print beginning with the Nth item from the start of each file, other‐
wise, print the last N items in the file. N may have a multiplier suf‐
fix: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB
1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
答え2
元の投稿者は 8 年後に解決策を見つけたと確信しています。このスレッドを読んでいる他の人のために、もう 1 つ解決策を示します...
curtail は、次のコマンドを使用してプログラムの出力のサイズを制限し、最後の 200 MB の出力を保持します。
run_program | curtail -s 200M myprogram.log
答え3
唯一の解決策は、独自のユーザー空間ファイルシステムを作成するか、既存のファイルシステムに貢献することかもしれません。部分的なリストをご覧ください。ユーザー空間のファイルシステム
貢献できるスキルがない場合は、プロジェクトの宣伝や資金、またはその両方を提供して、代わりに貢献してもらいましょう。
それをやる時間があればいいのにと思います。私はずっとこれとまったく同じことをしたいと思っていました。
答え4
これが私の2番目の答えです。これはかなりハックっぽいです。
watch(1) を使用して繰り返し実行しますtail --bytes=1024
(ログファイルの最後の 1024 バイト。回答を提供してくれた @jjclarkson に感謝します)。
watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch
次に、次のコマンドでファイルを表示します。
less --raw-control-chars /tmp/messages.watch
watch
と while ループの違いは、watch
/var/log/messages に変更があった場合にのみ /tmp/messages.watch が更新されることです。
while true; do
tail --bytes=1024 /var/log/messages > /tmp/messages.watch
sleep 1
done
また、test
while ループに を入れて、/var/log/messages が更新された場合にのみ tail が実行されるようにすることもできると思いますが、今はそれを理解しません。