同じマシン上で互いのサーバー/デーモンとクライアントプロセスを見つけることはできますか?

同じマシン上で互いのサーバー/デーモンとクライアントプロセスを見つけることはできますか?

Ubuntuでは、一部のサーバー/デーモンと一部のクライアントをローカルで実行することがよくあります。サーバー/デーモンとクライアントは、すべてのプログラム(emacsデーモンとクライアント、Screenデーモンとクライアント、誰かが作成したサーバーとクライアント)であり、名前がどのように割り当てられるかわからないとします。

  • クライアントプロセスのPIDのみを提供したら、サーバー/デーモンプロセスのPIDを見つける方法はありますか?

  • サーバー/デーモンのPIDのみが与えられたすべてのクライアントのPIDを見つける方法はありますか?

私が要求することが不可能な場合は、できるだけ一般的な目標を達成するために追加で必要な最小限の情報は何ですか?

ありがとうございます。

ベストアンサー1

ほとんどのプロセス間通信(IPC)形式は、いくつかのユーティリティを使用して追跡できます。ソケット(ネットワークソケットとUNIXソケット)は非常に一般的であり、いくつかの一般的なツールを使用して追跡できます。使い方の例を見てみましょうnetstat -ap

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      810/python3         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      858/nginx: master process 
<snip>
tcp        0      0 127.0.0.1:46858         127.0.0.1:5000          ESTABLISHED 860/nginx: worker process
<snip> 
tcp        0      0 127.0.0.1:5000          127.0.0.1:46858         ESTABLISHED 810/python3         

PID 860と810を持つ2つのプロセスが通信中です。この例では、810がサーバーです。netstat出力を分析したり、視覚的にそれgrepを確認したりできます。

また、クライアントがPID 810について何を言っているのかを見たいと思う場合は、次のことができますlsof -p 810

COMMAND PID USER   FD      TYPE             DEVICE  SIZE/OFF    NODE NAME
<snip>
python3 810 user    8u     IPv4              35702       0t0     TCP 127.0.0.1:5000 (LISTEN)
python3 810 user   10u     IPv4            4682120       0t0     TCP 127.0.0.1:5000->127.0.0.1:46858 (ESTABLISHED)

ここで、プロセスが通信しているエンドポイントは識別できますが、PIDは識別できません。他のPIDを識別するには、次のようにしますlsof -i :46858

COMMAND PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 810  user   10u  IPv4 4682120      0t0  TCP localhost:5000->localhost:46858 (ESTABLISHED)
nginx   860 nginx   18u  IPv4 4681280      0t0  TCP localhost:46858->localhost:5000 (ESTABLISHED)

出力の下部にはnetstatUNIXソケットがあります。

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
<snip>
unix  2      [ ACC ]     STREAM     LISTENING     21936    1/systemd            /run/dbus/system_bus_socket
<snip>
unix  3      [ ]         STREAM     CONNECTED     28918    648/dbus-daemon      /run/dbus/system_bus_socket

どちらのプロセスもUNIXソケットを使用していることがわかります/run/dbus/system_bus_socket。したがって、プロセスの1つを知っている場合は、それを見て他の側面を識別できるはずです。lsofこの場合は再利用できますlsof /run/dbus/system_bus_socket

これは少し複雑であることを知っていますが、役に立つことを願っています。ある種のファイル/ハンドル(パイプなど)を使用する他の種類のIPClsofも追跡に使用できます。

おすすめ記事