Я запустил проверку strace
на сбое клиентского приложения и получил что-то вроде этого:
socket(PF_LOCAL, SOCK_SEQPACKET|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
setsockopt(3, SOL_SOCKET, SO_PASSCRED, [1], 4) = 0
connect(3, {sa_family=AF_LOCAL, sun_path="/path/to/socket"}, 19) = -1 EPROTOTYPE (Protocol wrong type for socket)
close(3) = 0
exit_group(2) = ?
+++ exited with 2 +++
Затем я попыталсяпредполагатьтип сокета путем эмуляции сокета на месте с различными параметрами socat
, но безрезультатно.
Я также посмотрел код из этого ответаздесь, но, похоже, он создает сокет, а не использует существующий, и я не могу найти, как получить сокет из пути.
Есть ли простой способ, не заглядывая в исходный код, определить детали (например, тип протокола) существующего сокета по пути к сокету (если он существует)?
решение1
Вы можете использовать lsof /path/to/socket
:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
hindsight 19619 root 6u unix 0xffff88038612b480 0t0 257123917 /path/to/socket
Зная, PID
вы можете узнать больше о самом процессе:
cat /proc/19619/io
rchar: 11635200437
wchar: 2722080850
syscr: 16905056
syscw: 920240
read_bytes: 36397568
write_bytes: 3515994112
cancelled_write_bytes: 760422400
Или вы можете использовать его ss
для отображения всех сокетов Unix.
ss -x
-x
Отображение сокетов домена Unix-e
Показать подробную информацию о сокетах-m
Показать использование памяти сокета
и вы можете отфильтровать по определенному типу:
ss -x -A unix_stream