今日も同じ問題がありました。残念ながら、私のシステムでは -T lsof のオプション f を受け入れません フラグ、そして knetstat もビルドしたくなかった カーネル モジュール。
幸いなことに、私は strace できる立場にいました。 次のように、ソケットをセットアップしている間、アプリケーション:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
これは ./program arg1 arg2 をトレースします 、トレースを /tmp/log に書き込みます . setsockopt() のみをトレースします ソケットオプションを設定するために使用されるシステムコール。オプション -f strace になります トレースされたプログラムによって作成された子プロセスもトレースします。
運が良ければ /tmp/log 次のような行が含まれます:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
これは、プロセス 18806 を示しています setsockopt() と呼ばれる FD 60 で SO_KEEPALIVE を設定する 1 まで (有効化)、およびシステム コールがリターン コード 0 で成功したこと .
既存のプロセスにアタッチすることも可能です:
strace -e trace=setsockopt -f -o /tmp/log -p PID
CTRL-C を使用してプロセスから切り離すことができます 、および -o を省略します トレースを stderr に送信するオプションとその引数 .
Linux では、knetstat カーネル モジュールを使用して、SO_BROADCAST を含むソケット オプションを調べることができます。 .
lsof(8) を使用できます . PID の場合 プロセスIDとFD 興味のあるソケットのファイル記述子番号です。これを行うことができます:
lsof -a -p PID -d FD -T f
プロセスのすべての IPv4 ソケットを一覧表示するには:
lsof -a -p PID -i 4 -T f
これにより、ソケット オプションが SO= で出力されます。 などの情報があります。オプションが設定されていない場合は、空の文字列が返されるため、SO=PQLEN=0 のように表示されることに注意してください。 など SO_BROADCAST をテストするには 、文字列 SO_BROADCAST を grep するだけです SO= の後 、例
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi