シェルスクリプトレベルでファイルサイズ(stdout)を制限する簡単な方法は?


10

OK、これは私の観点からは非常に実用的なユースケースです。

出力をファイルに記録する単純なシェルワンライナーがあるとします。これは、たとえばtcpdumpのように、何でもかまいません。出力ファイルが指定されたサイズを超えないようにするための一般的で簡単な方法はありますか?

これは、誤ってマウントポイントの使用可能なスペース全体を埋めるのを防ぐためです。スクリプトを忘れた場合、またはスクリプトが1時間あたりGBのデータを生成する場合、この単純なデバッグタスクでシステムがクラッシュする可能性があります。

今、私はいくつかのツール(tcpdumpでの-W / -Cの組み合わせなど)に組み込まれているオプションを認識しています。私に必要なのは、非常に一般的なフェイルセーフです。

短い話-私が次のようなスクリプトを実行すると:

% this -is --my=very|awsome|script >> /var/tmp/output.log

output.logが1GBを超えないようにする方法。

スクリプトはクラッシュしたり、強制終了したりすることがあります。

私が探している解決策は、ubuntu / debian / fedoraのような人気のあるディストリビューションで利用可能なツールのみを使用して、簡単でシンプルであるべきです。一般に、広く入手可能なもの。複雑な複数行プログラムは、言語/テクノロジーに関係なく、ここではオプションではありません。

回答:


16

headこれに使用できます:

command | head -c 1G > /var/tmp/output.log

サフィックスとしてK、M、Gなどを受け入れます(デフォルトはバイトです)。ベース10バージョンを使用するには、「B」を追加します。


頭と壁の反対これはもっと簡単なことではありません。ありがとう!
mdrozdziel

2
そうですtail -c 1Gまた、イベントの尾を見て便利、動作します。当然、コマンド終了後にフラッシュします。
ダッシュダッシュ2016年

サフィックスの単位はMac OSでは機能しません。
anumi

0

これらのスクリプトの実行にのみ使用されるユーザーの最大ファイルサイズを設定します。

このファイル/etc/security/limitsは、特定のユーザーに明示的な値がない限り、「デフォルト」の値でユーザーを制限します。これらのユーザー固有の値は、デフォルト値を上書きします。OSによっては、ファイル名が若干異なる場合があります。

ログユーザーの名前がlog_makerの場合は、次の行をファイルに追加します。

log_maker hard fsize 1000000

fsizeの後の数値は、最大ファイルサイズ(KB)です。



0

あなたはでファイルを制限することができます

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

尾を同じファイルに直接書き込むと、空のファイルが作成されます。したがって、一時ファイルを使用する必要があります。


tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.logこれにより、ログが強制終了されます。>の代わりに>>を使用したいと思いますか?
djdomi

このコマンドの目的は、最後の1Gのみでログを書き換えることです。>>は前のコマンド用です。doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
セヴェリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.