Ano, můžete to udělat. Vše, co potřebujete, je klepnout na systém.
Zvažte jeden z příkladů skriptů systemtap, které vytisknou PID a název procesu jakéhokoli programu, který čte nebo zapisuje zadaný inode (a váš soket domény Unix je přesně taková věc).
Tento skript můžete triviálně upravit tak, aby tiskl skutečná čtená/zapisovaná data; Nechám to jako cvičení na čtenáři.
Krátké odpovědi jsou ne a ne snadné.
V Linuxu lsof spoléhá na /proc/net/unix
k načtení informací týkajících se soketů domény UNIX. Toto rozhraní uvádí všechny vázané sokety, ale není sledovat koncové body. Takže můžete podívejte se, jaké zásuvky existují, ale nevidíte, co je k nim připojeno. Někde tato informace je sledováno, musí být sledováno, jinak by spojení soketů nefungovalo. Ještě jsem nenašel žádný mechanismus pro získání informací o připojení.
Otázka čmuchání je o něco zajímavější, ale neméně zklamáním. "Nesnadno" jsem myslel to, že neexistuje žádný háček, který by se mohl vplížit a uchopit tato data. Nejbližším analogem je použití tcpdump nebo Wireshark, které oba používají libpcap k tomu, aby skutečně udělaly těžkou práci. Zatímco síť (AF_INET) a doména UNIX (AF_UNIX) jsou obě vytvořeny pomocí socket()
volání funkce, oba používají connect()
pro připojení k oběma použijte read()
a write()
pro zpracování dat jsou zpracovávány různými subsystémy jádra. To má nešťastný vedlejší účinek, že libpcap není navržen pro práci s doménovými sokety UNIX.
Problém má o něco méně temnou stránku. Podívejte se na manuálovou stránku pro recv(2)
. Toto je systémové volání nižší úrovně read()
využívá. Existuje příznak pro recv()
s názvem MSG_PEEK
. To vám umožní sledovat provoz procházející přes soket domény UNIX. Takže to je ta světlá stránka, stinná stránka je, že podle mého nejlepšího vědomí neexistuje žádná současná aplikace určená k tomu. Takže se díváte na nějaké vývojové úsilí.
Opravdu bych si přál, aby bylo pěkná jednoduchá odpověď F'YEAH na obě části vaší otázky.
Vím, že to není odpověď na hlavní otázku, ale skončil jsem tady a hledal jsem jen načuchání komunikace na zásuvce. Rozhodl jsem se napsat příspěvek pro ostatní, jako jsem já. Udělal jsem to takto:
$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock
Můžete odstranit -x a nechat -v pro komunikaci ascii. Doufám, že to někomu pomůže.