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

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

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も追跡に使用できます。

答え2

私は書いたピクセルこの目的のために(何よりも)。

px(他の有用なものの中で)あなたが通信している他のプロセスが何であるかを教えてくれます。

サンプル出力、IPCトレースを表示するには、一番下までスクロールします。

~ $ sudo px 49903
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
  --enable-audio-service-sandbox
  --origin-trial-disabled-features=MeasureMemory

kernel(0)                                     root
  launchd(1)                                  root
--> Google Chrome(49903)                      johan
      Google Chrome Helper(49922)             johan
      Google Chrome Helper(49958)             johan
      Google Chrome Helper (GPU)(49920)       johan
      Google Chrome Helper (Renderer)(49935)  johan
      Google Chrome Helper (Renderer)(49936)  johan
      Google Chrome Helper (Renderer)(49943)  johan
      Google Chrome Helper (Renderer)(49950)  johan
      Google Chrome Helper (Renderer)(49951)  johan
      Google Chrome Helper (Renderer)(49957)  johan
      Google Chrome Helper (Renderer)(64466)  johan
      Google Chrome Helper (Renderer)(75275)  johan
      Google Chrome Helper (Renderer)(76225)  johan
      Google Chrome Helper (Renderer)(76650)  johan
      Google Chrome Helper (Renderer)(76668)  johan
      Google Chrome Helper (Renderer)(76712)  johan

7d21h ago Google Chrome was started, at 2020-09-04T19:15:03+02:00.
0.3% has been its average CPU usage since then, or 32m25s/7d21h

Other processes started close to Google Chrome(49903):
  Google Chrome/chrome_crashpad_handler(49912) was started just after Google Chrome(49903)
  AlertNotificationService(49924) was started 1.0s after Google Chrome(49903)
  Google Chrome Helper(49922) was started 1.0s after Google Chrome(49903)
  Google Chrome Helper (GPU)(49920) was started 1.0s after Google Chrome(49903)
  Google Chrome Helper (Renderer)(49935) was started 1.0s after Google Chrome(49903)
  Google Chrome Helper (Renderer)(49936) was started 1.0s after Google Chrome(49903)
  VTDecoderXPCService(49934) was started 1.0s after Google Chrome(49903)

Users logged in when Google Chrome(49903) started:
  johan

2020-09-12T16:28:30.587930: Now invoking lsof, this can take over a minute on a big system...
2020-09-12T16:28:30.901834: lsof done, proceeding.

Others sharing this process' working directory (/)
  Working directory too common, never mind.

File descriptors:
  stdin : [CHR] /dev/null
  stdout: [CHR] /dev/null
  stderr: [CHR] /dev/null

Network connections:
  [IPv4] *:* (LISTEN)

Inter Process Communication:
  mDNSResponder(291): [unix] ->0x2b8028c5de1ab5b
  mDNSResponder(291): [unix] ->0x2b8028c5de1c5eb

For a list of all open files, do "sudo lsof -p 49903", or "sudo watch lsof -p 49903" for a live view.
~ $

関連情報