Dnes jsem měl stejný problém; bohužel v mém systému -T
možnost lsof
nepřijímá f
flag a také jsem nechtěl vytvářet knetstat
modul jádra.
Naštěstí jsem byl v pozici, kdy jsem mohl strace
aplikaci, když nastavovala soket, takto:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
To sleduje ./program arg1 arg2
, zapsat trasování do /tmp/log
. Sledujeme pouze setsockopt()
systémové volání, které se používá k nastavení voleb soketu. Možnost -f
dělá strace
také sledovat všechny podřízené procesy vytvořené sledovaným programem.
Pokud budete mít štěstí, /tmp/log
bude obsahovat řádky jako tento:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
To znamená, že proces 18806
s názvem setsockopt()
na FD 60
nastavte SO_KEEPALIVE
na 1
(jeho povolení) a že systémové volání bylo úspěšné s návratovým kódem 0
.
Je také možné připojit k existujícímu procesu:
strace -e trace=setsockopt -f -o /tmp/log -p PID
Z procesu se můžete odpojit pomocí CTRL-C
a vynechejte -o
volba a její argument pro odeslání trasování na stderr
.
V Linuxu můžete použít modul jádra knetstat ke kontrole voleb soketu, včetně SO_BROADCAST
.
Můžete použít lsof(8)
. Pokud PID
je ID procesu a FD
je číslo deskriptoru souboru soketu, o který máte zájem, můžete provést toto:
lsof -a -p PID -d FD -T f
Seznam všech IPv4 soketů procesu:
lsof -a -p PID -i 4 -T f
Tím se vytisknou možnosti soketu s SO=
, mimo jiné informace. Všimněte si, že pokud nejsou nastaveny žádné možnosti, dostanete prázdný řetězec, takže uvidíte něco jako SO=PQLEN=0
atd. Chcete-li otestovat SO_BROADCAST
, stačí grep pro řetězec SO_BROADCAST
za SO=
, např.
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi