パイプの最後のNバイトだけを維持しますか?

パイプの最後のNバイトだけを維持しますか?

ソケットからファイルにデータを転送しています。すべてのデータを保存する必要がある場合は、次のように簡単です。

$ nc -l 5001 > file.bin

最初のバイトだけを保存したい場合は、n次のようになります。十分簡単さらに:

$ nc -l 5001 | pv -Ss 2M > file.bin

新しいデータが到着したら、キューのようにファイル内の古いデータを置き換えることができるように、最大​​サイズのファイルにデータをパイプする方法はありますか?そのようなものがある場合は、固定サイズの名前付きパイプを使用することもできます。

理想的には、すべてのファイルを保存してから切り取る必要なく継続的に実行されます。つまり、tail単にファイル全体を保存して実行したくありません。

答え1

n = 2Mの場合は、次を使用します。

nc -l 5001 | tail -c 2M > file.bin

または以下を使用してください。

nc -l 5001 | tail -c 2097152 > file.bin

答え2

したがって、より多くのバイトを保存しなくても、いつでも最後のNバイトを見ることができるようにしたいと思います。私は正しく理解していますか?

これをリアルタイムで(バイト単位で)実行するには、おそらく特別なソフトウェアが必要です。一般に、人々はリングバッファに最新のデータを格納しますが、ファイルからこのように配置されたデータを読み取ることができるソフトウェアは見つかりません。別のオプションは、すべてのデータを通常の方法でファイルに書き込み、不要になった古いデータを削除するようにオペレーティングシステムに定期的に指示することです。 (以前にこの内容を提案するコメントを見たようですが削除されたようです。)

おそらくPerlスクリプトを使用してこれを行うことができます。fallocate捨てる。

最新のデータが不要な場合は、高速で汚れたシェルソリューションは、固定ブロックをファイルに保存し、各ブロック間でファイル名を別の名前に変更することです。最新の完全ブロックは常に2番目のファイルで利用可能です。

例えば

i=0
while true; do echo $i; sleep .1; i=$((i+1)); done |
    while true; do
        head -10 > out1
        mv out1 out2
    done

最初のループはいくつかのテスト出力を生成しますが、2番目のループは10行のブロックを読み取り、最後のブロック全体に入り、最後の部分ブロックout2に入るようにしますout1head必要に応じてパラメータを変更します。

これらの小さなチャンクの場合、出力バッファは常に空のままになりheadますout1stdbuf -o0 head ...これが問題であれば使用してください。

関連情報