私は最新のUbuntu LTSを実行してコンピュータと対話するアプリケーションを書いています。機械には温度制御用の複数のセンサーと複数のPIDループがあります。データ入力速度は毎秒約20個程度と非常に高速です。テスト中にこれらのそれぞれに別々のストリームとしてアクセスできるようにしたいです。これにより、一部の端末で進行中のすべてのタスクを「主に」表示できるように準備できます。
私の現在のソリューションは、各ストリームにファイルを提供し、アプリケーションが読み取るときに必要なファイルを追加することです。次に、「tail -f /tmp/Pressure.log」などのコマンドを入力します。
これは使い捨てデータなので、現在は/ tmpに入れて消去できます。しかし、これは書き込みが多すぎるため、ファイルサイズが大幅に大きくなる可能性があります。理想的には、アプリケーションが私がやっているように追跡できる内容を/ devに書き込むことです。
それでは、アプリケーションストリーミングテキストを別のプロセスで表示できるようにする最善の方法は何ですか?理想的には、申請書にできるだけ少ない変更を適用したいと思います。みんなありがとうございます!
答え1
データを保持せずにあるアプリケーションから別のアプリケーションにストリーミングする一般的なUNIX方式はパイプです。シェルから:
data-producer | data-consumer
単一の生産者がエクスポートし、単一の消費者が受け取るよりも複雑なパターンに対して常に名前付きパイプを使用できます。
# Set up the pipes
mkfifo /tmp/pressure.fifo
mkfifo /tmp/temperature.fifo
# Start the emiters
monitor-pressure >/tmp/pressure.fifo
monitor-temperature >/tmp/temperature.fifo
# Take input from multiple places
collect-and-analyse-all-data /tmp/pressure.fifo /tmp/temperature.fifo
この場合、パイプ(一般名がないか名前付き)にはいくつかの欠点があります。
- プロデューサは、消費者が実行中かデータを読み取る準備ができるまでブロックします。それ以外の場合、パイプはデータを特定のポイントまでバッファリングしてからブロックします。データをバッファリングしたりプロセスをブロックしたりするよりも、誰も聞いていない場合、データロガーがデータを削除する方が良いかもしれません。あなたのアプリケーションによって異なります。
- 消費者が実行を停止するかパイプを閉じると、生産者はパイプに書き込もうとするとエラーが発生します。これにより、素朴なプログラムが中断されます。エラーを無視し、消費者がパイプを再度開くまで試行することはできますが(名前付きパイプのみ)、これを達成するにはさらに作業を行う必要があります。
UNIX にはさまざまな IPC メカニズムがあり、他の多くのメカニズムから選択できます。
- 無限に増える一時ファイル(今やっていることに似ている)
- データが最新のデータ項目で継続的に置き換えられる一時ファイル。単純ですが、消費者がデータ項目を交換する前に読み取る時間がない場合は脆弱です。
- 一時ファイルは特定のサイズに増えてから回転します。同期が正常に機能し、ファイルが回転したときにデータ項目が失われないようにするには、生産者と消費者側でより多くの作業を実装する必要がありますが、これは良いトレードオフです。
- 共有メモリ
- データグラムソケット。
- など...
最後の2つはシェルスクリプトで実行するのは難しいですが、最後のもの(データグラムソケット)は少なくとも可能であり、Pythonなどのプログラミング言語を使用すると簡単になります。
もう少し時間を費やし、Python(またはRubyなど)などの言語の基本的なネットワーキング技術を持っている場合は、データグラムソケット(UNIXまたはUDP)が適しています。データは一時的なため、メモリを消費せず、生産者と消費者間の通信設定を調整するために何もする必要はありません(正しいポートで送受信するだけです)。そのため、どちらか一方がクラッシュしたりインポートしたりすることがあります。エラーの再起動を管理する必要はなく、生産者と消費者がリモートにいる可能性があります。唯一の欠点は、使用しているアプリケーションが実行されていないときにデータがバッファリングされるのではなく、ビットバケットに入ることです。
繰り返しますが、どのソリューションを選択するかはアプリケーションによって異なります。
答え2
1つのオプションは、名前付きパイプを使用することです。アプリケーションは名前付きパイプに書き込むことができ、現在実行されているのと同じ方法でパイプを監視できます。パイプがいっぱいになったときにプログラムの実行がブロックされないように、パイプへの非ブロック書き込みを実行できます。ただし、書き込めないデータは失われることに注意してください。
名前付きパイプの作成の詳細については、「mkfifo」を参照してください。 mkfifo(3) を使用してプログラムでこれを行うか、mkfifo(1) を使用して手動で実行できます。