あるプロセスから別のプロセスにパイプされたバイト数をカウントする


17

あるプロセスから別のプロセスにデータをパイプするシェルスクリプトを実行しています

process_a | process_b

2つのプログラム間で何バイトが渡されたかを知る方法を知っている人はいますか?私が現時点で考えることができる唯一の解決策は、stdinから読み取り、stdoutに書き込み、転送されたすべてのデータをカウントする小さなcプログラムを作成し、環境変数にカウントを保存することです。

process_a | count_bytes | process_b

誰にも素敵なソリューションがありますか?

回答:


16

ddを介してパイプします。ddのデフォルト入力はstdin、デフォルト出力はstdoutです。stdin / stdout I / Oが終了すると、転送されたデータ量をstderrに報告します。

ddの出力をキャプチャし、他のプログラムがすでにstderrと通信している場合は、別のファイル記述子を使用します。例えば、

$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-

2
スキップexecしてファイルに直接出力できませんでしたか?input-command | dd 2>~/fred | output-command
追って通知があるまで一時停止します。

2
ええ、はい。どうやら「あの」瞬間の1つがあったようです。ごめんなさい。
フィルP

28

pvパイプビューアを使用します。それは素晴らしいツールです。一度それについて知ると、それなしでどうやって生きてきたかは決してわかりません。

また、進行状況バーと転送の「速度」も表示できます。


私の検索ではこれに遭遇していましたが、転送されたバイト数を変数に設定して、別のプロセスで使用できるようにする必要があります。
サイモンホジソン

使用例:cat file | pv -bファイルのサイズを返します。
ロドールガス

6

process_a | tee >(process_b) | wc --bytes動作する可能性があります。その後、wcのカウントを必要な場所にリダイレクトできます。/にprocess_b何かを出力する場合、おそらくこれをどこかにリダイレクトする必要があります。stdoutstderr/dev/null

少し不自然な例:

filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295

説明として:tee複数のファイル(およびstdout)に出力を向けることができ、>()コンストラクトはbashの「プロセス置換」であり、この場合、プロセスは書き込み専用ファイルのように見えるため、プロセスとファイルにリダイレクトできます(多くのプロセスに出力を送信するための使用例についてこちらまたはこの質問と回答をご覧くださいtee)。


私はこの解決策が好きです、悲しいことに、私が使用しているシェル(BusyBox)は>()表記をサポートしていないように見えますが、私が望んでいることを行う方法を提供します。
サイモンホジソン

そうです、その機能を使用するにはかなり完全なbashが必要です-これは一般的には使用されないので、カットダウンシェルから削除されます(多かれ少なかれbashと互換性があることをターゲットにしたものでも)スペースを節約するためのbusyboxなど。
デビッドスピレット2009

1

私はパーティーに遅れていることは知っていますが、この便利なスレッドを強化できる良い答えがあると思います。
これは@Phil Pと@David Spillettの回答の組み合わせですが、

  • @Phil Pとは異なり、新しいファイルの作成を回避します
  • @David Spillettとは異なり、パイプライン構造を維持します

Bytes-countは、process_bの出力とともにstdoutに出力されます。
出力を使用するときに、バイトを含む行を識別するために接頭辞を使用できます(Bytes:例)。

exec 3>&1
process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b
exec 3>&-

警告:
出力
の行の順序に依存しないでください。順序は予測不能であり、同じパラメータで同じスクリプトを呼び出した場合でも、常に異なる可能性があります。


悲しいことに、それは...まだbashの専用構造です
ミハイル・T.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.