今日も同じ問題がありました。残念ながら、私のシステムでは -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