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)
出力の下部にはnetstat
UNIXソケットがあります。
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.
~ $