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