LINUX.ORG.RU
ФорумAdmin

lsof /tmp/socket на Debian 11.9 выводит только процесс, который слушает сокет и не выводит подключившийся

 , ,


0

1

Хотя согласно всему что нагуглил должен выводить все процессы. Подскажите, пожалуйста, где я туплю?

Например, вот делаю такое тестовое соединение с помощью netcat, ниже результат ps -ef | grep nc:

user      9584     823  0 06:19 pts/2    00:00:00 nc -lU /tmp/socket
user      9585     827  0 06:19 pts/3    00:00:00 nc -U /tmp/socket

Соединение установлено, данные передаются. Но lsof /tmp/socket выводит:

nc      9584 user    3u  unix 0x00000000657f3ea6      0t0 70560 /tmp/socket type=STREAM
nc      9584 user    4u  unix 0x0000000008ee9d1b      0t0 70561 /tmp/socket type=STREAM

Никак не могу понять, как мне с помощью lsof увидеть оба процесса, соединённых через этот сокет.

Возможно это связано с тем что при просмотре используемых процессом 9585 юникс-сокетов через `lsof -U -a -p 9585’, не выводится файл сокета, также понимаю почему.

nc      9585 user    3u  unix 0x00000000aeec7ae9      0t0 70565 type=STREAM


Последнее исправление: ANONYMOUS (всего исправлений: 1)

Потому что сокет-файл это серверный конец соединения. Его создал сервер и слушает. Клиент этот файл открыть не может, клиент подключается по адресу локального сокета - это другое. Иначе говоря, адрес сокета и адрес, куда сокет подключён - это разные адреса, и в случае tcp это всем почему-то очевидно, а с unix-сокетами нет.

Можно ли подобными утилитами узнать адрес, куда сокет подключён - даже не знаю.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Спасибо за пояснение. Вероятно, меня сбило с толку то, что в случае локального соединения через интернет-сокеты, отображается и процесс на серверном конце и процесс на клиентском.

Вывод команды ss -xpa | grep '"nc"' подтверждает ваши слова:

u_str LISTEN 1      5                                     /tmp/socket 70560            * 0     users:(("nc",pid=9584,fd=3))

u_str ESTAB  0      0                                               * 70565            * 70561 users:(("nc",pid=9585,fd=3))

u_str ESTAB  0      0                                     /tmp/socket 70561            * 70565 users:(("nc",pid=9584,fd=4))

Для процесса-клиента имя файла сокета не выводится. Опций, которые позволили бы его отобразить я у ss не нашел.

Подскажите, пожалуйста, если есть представление. Как в таком случае оптимальным образом найти, какие процессы, запущенные в системе подключены как клиенты к серверному процессу, висящему на конкретном unix-сокете?

Столкнулся с такой необходимостью, когда бытался разобраться какой из скриптов не закрывает соединения с Postgres, в результате чего остаётся висеть куча процессов в состоянии idle.

С проблемой я уже разобрался, просто методом перебора. Кроме того, обнаружил что у lsof есть ключ -E, позволяющий посмотреть кто висить с другого конца.

Но уже просто любопытно, есть ли для этого другой, красивый и простой способ? Наверняка ведь, оставшиеся не закрытые соединения - не такая уж редкая проблема при отладке.

ANONYMOUS
() автор топика