HTTP経由でストリーミングする必要がある大容量ログファイルがあります。パフォーマンス上の理由から、すべてのアイテムをキャプチャ/収集したいと思います。N確認して送信してください。だから基本的に私が望むのは、ファイルのバッファリングされた出力n行です。これを達成するためのtail / headまたは他のLinuxコマンドはありますか?
答え1
awk
「送信データ」ディレクトリを別々に分割して監視するinotifywait
組み合わせをお勧めします。たとえば、「outgoing」というディレクトリを作成すると、新しいファイルが表示されるたびにそのファイルが送信されます。
スクリプト1:awk
10行ごとに分割し、数字Xを増やして新しいファイル「bufferX」に書き込みます。必要に応じて調整します。
$cat split.awk
NR%10==1 {buffer="buffer"++i}
{
print > buffer
if (NR%%10==0) {system("mv "buffer" outgoing/")}
}
スクリプト2:発信ディレクトリを監視し、新しいログ配置が表示されたらデータを送信します。私はあなたがcurl
転送に使用していると仮定しています。それに応じて調整してください。
$cat watch_dir.sh
#!/bin/bash
inotifywait -m -o watch.logs -e moved_to --format '%w%f' outgoing/ |\
while read bufferfile
do
curl -T ${bufferfile} http://taget.url && rm ${bufferfile}
done
これは「送信」ファイルのinotifywait
ディレクトリを監視し、モニタモードで無限に実行され、「watch.logs」でlgsを実行し、パスとファイル名で検出されたファイルを印刷します。最後の部分ではコマンドを読み、アップロード後にファイルを削除します。-e
moved_to
-m
-o
--format
curl
発信ディレクトリを作成し、次を実行します。
bash watchdir.sh & <your_command_creating_output> | awk -f split.awk