web-dev-qa-db-ja.com

Unix / Linuxでプロセス間通信を傍受する方法はありますか?

ネットワークトラフィックを傍受/分析するために、 Wireshark というユーティリティがあります。

Unix/Linuxの任意の2つのプロセス間のすべてのプロセス間通信を傍受するための同様のユーティリティはありますか?

メモリ内にいくつかのプロセスを作成しましたが、それらが互いにどのように通信するかをプロファイルする必要があります。

15
Lazer

これは通信メカニズムに大きく依存します。

  • スペクトルの最も透過的な端では、プロセスはインターネットソケットを使用して通信できます(つまり、[〜#〜] ip [〜#〜])。次に、wiresharkまたはtcpdumpは、ループバックインターフェイスをポイントすることにより、すべてのトラフィックを表示できます。

  • 中間レベルでは、pipesおよびunixソケットのトラフィックを監視できますtruss/strace/trace/...、システム追跡のスイス軍チェーンソー。ただし、これによりプロセスが大幅に遅くなる可能性があるため、プロファイリングには適さない場合があります。

  • スペクトルの最も不透明な端には、共有メモリがあります。共有メモリの基本的な動作原理は、アクセスは関連する各プロセスで完全に透過的であり、共有メモリ領域を設定するために必要なのはシステムコールだけです。これらのメモリアクセスを外部から追跡することは、特にタイミングを乱さないように観察する必要がある場合は困難です。 Linux trace toolkit (カーネルパッチが必要)のようなツールを試して、有用な情報を抽出できるかどうかを確認できます。これは、Solarisに優れたツールがあると私が期待するような分野です(ただし、私にはその知識がありません)。

    ソースがある場合、最良のオプションは、主要なライブラリ関数にトレースステートメントを追加することです。これは、(全体の)ソースがなくても、共有メモリにアクセスするプログラムの部分の制御フローを十分に理解している限り、LD_PRELOADトリックで達成できる可能性があります。

これにより、プロセスが読み書きする内容が表示されます。

strace -ewrite -p $PID

クリーンな出力ではありませんが(write(#、)のような行を表示します)、機能します! (そして、単一行:Dです)引数が省略されているという事実も嫌いかもしれません。これを制御するには、表示される文字列の最大長を設定する-sパラメータを使用します。

すべてのストリームをキャッチするので、なんとかしてフィルタリングすることをお勧めします。

あなたはそれをフィルタリングすることができます:

strace -ewrite -p $PID 2>&1 | grep "write(1"

記述子1の呼び出しのみを示しています。 2>&1は、straceがデフォルトでstderrに書き込むため、stderrをstdoutにリダイレクトします。

6
naugtur