コマンドの出力をリングバッファに格納

コマンドの出力をリングバッファに格納

標準出力から多くの出力を生成する長期実行コマンドがあります。たとえば、過去3日間または過去1 GBだけを保存し(行が途中で切り捨てられないように)、可能であればファイルブロックを20MiB以下に保存したいと思います。各ファイルブロックの名前は、数字のサフィックスまたはタイムスタンプで指定されます。

それは次のとおりです。

my-cmd | magic-command --output-file-template=my-cmd-%t \
                       --keep-bytes=1G \
                       --keep-time=3d \
                       --max-chunk-size=20M \
                       --compress=xz

書く:

my-cmd-2014-09-05T10:04:23Z

20Mに達すると、圧縮して新しいファイルを開くなど、しばらくすると最も古いファイルの削除が開始されます。

そのようなコマンドは存在しますか?

私は他のアプリケーションで作成されたファイルを管理する機能があることを知っていますが、logrotateクローンジョブの設定、ルールの指定、プロセスの一時停止などを必要としない、より簡単なものを探しています。

ベストアンサー1

あなたはあなたが望むものを得ることができますパイプラインログ、これは、「実行中のプロセスのログを外部信号に応答する中間体を介して回転または消去することを可能にします。」たとえば、次のようになります。

spewstuff | pipelog spew.log -p /tmp/spewpipe.pid -x "gzip spew.log.1"

その後、からpidを取得します/tmp/spewpipe.pid

kill -s USR1 $(</tmp/spewpipe.pid)

しかし、cronのようなものを使って設定する必要があります。しかし、問題があります。参考にしてくださいgzip spew.log.1。これは-x、ログの回転後にコマンドが実行されるためです。そのためspew.log.1.gz、gzipを実行してからファイルを移動する短いスクリプトを作成し、それをコマンドとして使用しない限り、上書きするたびに追加の-x問題が発生します。

完全な公開:私はこれを書いたので、当然動作します。完璧。 ;) バージョン 0.2 では、圧縮オプションやより良い機能を提供するオプションを念頭に置いておきます(意図した目的は少し-x異なりますが、上記のように動作します)。自動ロールオーバーも良い考えです...最初のバージョンは、不要な機能を追加しようとする誘惑に抵抗したため、意図的に最小限に抑えられました(最終的にこれを行うためにクローンタスクを設定することはそれほど難しくありません)。

その目的は次のとおりです。テキスト-z出力;潜在的なnullバイトがある場合は、0を別のものに置き換える - を使用する必要があります。これは実装を簡素化するための妥協案です。

おすすめ記事