Ich hatte heute das gleiche Problem; leider auf meinem System der -T
Option von lsof
akzeptiert den f
nicht Flag, und ich wollte auch nicht den knetstat
bauen Kernel-Modul.
Zum Glück war ich in der Lage, strace
zu machen die Anwendung, während sie den Socket einrichtete, wie folgt:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
Dies verfolgt ./program arg1 arg2
, wobei die Ablaufverfolgung in /tmp/log
geschrieben wird . Wir verfolgen nur die setsockopt()
Systemaufruf, der verwendet wird, um Socket-Optionen festzulegen. Die Option -f
macht strace
verfolgen Sie auch alle untergeordneten Prozesse, die vom verfolgten Programm erstellt wurden.
Wenn Sie Glück haben, /tmp/log
wird Zeilen wie diese enthalten:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
Dies zeigt an, dass 18806
verarbeitet wird genannt setsockopt()
auf FD 60
um SO_KEEPALIVE
einzustellen bis 1
(Aktivieren) und dass der Systemaufruf mit dem Rückgabecode 0
erfolgreich war .
Es ist auch möglich, an einen bestehenden Prozess anzuhängen:
strace -e trace=setsockopt -f -o /tmp/log -p PID
Mit CTRL-C
können Sie sich vom Prozess lösen , und lassen Sie -o
weg Option und ihr Argument, um die Ablaufverfolgung an stderr
zu senden .
Unter Linux können Sie das Kernelmodul knetstat verwenden, um Socket-Optionen zu überprüfen, einschließlich SO_BROADCAST
.
Sie können lsof(8)
verwenden . Wenn PID
ist die Prozess-ID und FD
die Dateideskriptornummer des Sockets ist, an dem Sie interessiert sind, können Sie Folgendes tun:
lsof -a -p PID -d FD -T f
So listen Sie alle IPv4-Sockets eines Prozesses auf:
lsof -a -p PID -i 4 -T f
Dadurch werden die Socket-Optionen mit einem SO=
ausgegeben , neben anderen Informationen. Beachten Sie, dass Sie, wenn keine Optionen festgelegt sind, eine leere Zeichenfolge erhalten, sodass Sie etwas wie SO=PQLEN=0
sehen usw. Zum Testen auf SO_BROADCAST
, suchen Sie einfach nach der Zeichenfolge SO_BROADCAST
nach SO=
, z. B.
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi