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