ソケットからファイルにデータを転送しています。すべてのデータを保存する必要がある場合は、次のように簡単です。
$ 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
に入るようにしますout1
。head
必要に応じてパラメータを変更します。
これらの小さなチャンクの場合、出力バッファは常に空のままになりhead
ますout1
。stdbuf -o0 head ...
これが問題であれば使用してください。