Linuxでファイルの最後のnバイトを除いてすべてを削除する方法は?

Linuxでファイルの最後のnバイトを除いてすべてを削除する方法は?

ログがcatalina.out

他のサーバーはあまりにも多くのスペースを占めているため、非自発的に停止する必要がありました。catalina.out少なくともサーバーを削除して再起動するだけでチケットを心配する必要がないように、粘着テープでこの問題を修正したいと思います。

よくわかりませんが、1日のログが5GBを超えました。それでは、私がやりたいことをやろう予約されたこと1日後のファイルまたはファイルの最後の5GBを削除します。ここではどのコマンドが機能しますか?

これが問題に推奨される解決策ですか?それとももっと良い方法がありますか?

ベストアンサー1

catalina.outほとんどでなければなりませんこれは、アプリケーションがすべてのエラーを傍受し、それ自体を処理し、構成内の他の場所に記録できることを意味します。しかし、通常、これは完了せずにcatalina.out考慮されます。これアプリケーションログ。 Tomcatはデフォルトでファイルを回転しないため、問題が発生します。

アプリケーションを修復することに加えてファイルを切り捨てるより良い方法catalina.outは、特定のパッケージインストールですでに提供されているか(CentOS7用のtomcat 7では適切なcatalina.outログローテーションが提供されている)、新しいtomcatバージョンを使用することです。 〜のようにエラー64430WHO固定する最新のTomcatに統合され、Tomcat> = 7.0.105、> = 8.5.56、および> = 9.0.36にバックポートされました。

はい(1行にすべて)

CATALINA_OUT_CMD="/usr/bin/rotatelogs -f $CATALINA_BASE/logs/catalina.out.%Y-%m-%d.log 86400"

回転したファイルをさらに処理する必要があります。logrotateまたはそれに対応する特別なツール。

この質問に厳密に答えるか、少なくとも1つのファイル処理に関する部分に答えてくださいcatalina.out。 OPは次のよ​​うに書きました。

Linuxでファイルの最後のnバイトを除いてすべてを削除する方法は?

=>終わりを維持

ファイルの最後の5GBを削除してください。

=>続行

始め続ける

これで端を取り除きます。削除しても終わり代わりにログスタートロギングは悪い考えです。

POSIXtruncate(2):

名前

truncate - ファイルを指定された長さに切り捨てます。

[...]

説明する

truncate() 関数は、パスと呼ばれる一般ファイルのサイズを length バイトと同じにします。

コマンド実装がありますtruncate(1)。 ~のためGNU切り捨て(GNUと共にstat(1))はこのようにシェルで使用されます(最初にファイルが5GiBより大きいことを確認する必要があります。そうしないとサイズが大きくなります)。 5GiB予約:

if [ $(stat -c %s catalina.out) -gt $((5*1024*1024*1024)) ]; then
    truncate -s $((5*1024*1024*1024)) catalina.out
fi

結末を守る

これによりファイルの先頭が削除されます。これは、データをコピーせずにLinuxや十分なファイルシステム(Ext4、XFSなど)で次のように実行できます。fallocate(1)(追加のLinux専用機能を含む):

-p--punch-hole

オフセットから始まり、長さのバイトまでバイト範囲のスペースを確保します(つまり、穴を作成します)。

これにはデータのコピーは含まれませんが、ブロックソート(通常は4096バイトソート)が必要です。コピーコストなしでリングバッファのように常にファイルの終わりを維持できます。次のように使用できます(4096の倍数をソートするには追加の計算が必要です)。


oldsize=$(stat -c %s catalina.out) || exit 1

if [ $oldsize -gt $((5*1024*1024*1024)) ]; then
    holesize=$(( (oldsize-5*1024*1024*1024)/4096*4096 ))
    fallocate --punch-hole --length "$holesize" catalina.out
fi

--punch-hole--collapse-rangeTomcatの進行中の出力が中断されないようにするには(サイズを小さくするために残りのデータを最初に「移動」)、代わりに(ファイルを薄くし、見かけのサイズを維持してディスク容量を確保する)を使用してくださいcatalina.out。それ以外の場合は、Tomcatを再起動の前後に停止する必要があります。

おすすめ記事