Как просмотреть количество ожидающих данных в соке домена unix?

Когда я подключился к сеансу tmux с двух разных компьютеров, я хотел бы отслеживать количество ожидающих данных в сокетах обоих сеансов tmux . Чтобы проверить это, я зашел на компьютер A и на компьютер B , затем с компьютера B я использовал ssh для входа на компьютер A С каждой консоли я подключился к тому же сеансу tmux и начал запускать скрипт, который печатает номер итерации от 1 до 100M. В самом деле, я вижу, что числа итераций, напечатанных в локальной ( A ) консоли, больше, чем числа, напечатанные на удаленной консоли ( B ), поскольку для отправки сообщений на удаленный компьютер требуется время

 [user@server00 ~]$ lsof | grep tmux | grep unix tmux 1073 user 4u unix 0xf6dc2ac0 0t0 18681 socket tmux 1073 user 5u unix 0xf6dc3840 0t0 18682 socket tmux 1073 user 6u unix 0xf137ed00 0t0 19768 socket tmux 1073 user 7u unix 0xf6dc2880 0t0 18683 /tmp/tmux-1000/default tmux 1073 user 8u unix 0xf6cbcd80 0t0 22647 /tmp/tmux-1000/default tmux 1073 user 14u unix 0xf137ef40 0t0 12146 /tmp/tmux-1000/default tmux 1092 user 4u unix 0xf6cbd200 0t0 24848 socket tmux 1092 user 5u unix 0xf6cbef40 0t0 24849 socket tmux 1092 user 6u unix 0xf6cbed00 0t0 24850 socket tmux 1177 user 4u unix 0xf137fcc0 0t0 19947 socket tmux 1177 user 5u unix 0xf137fa80 0t0 19948 socket tmux 1177 user 6u unix 0xf137c240 0t0 19949 socket [user@server00 ~]$ netstat -a | grep tmux unix 2 [ ACC ] STREAM LISTENING 18683 /tmp/tmux-1000/default unix 3 [ ] STREAM CONNECTED 12146 /tmp/tmux-1000/default unix 3 [ ] STREAM CONNECTED 22647 /tmp/tmux-1000/default 

Поскольку я вижу только путь /tmp/tmux-1000/default я надеялся увидеть его размер, но его размер всегда равен 0

 [user@server00 ~]$ ls -l /tmp/tmux-1000/default srwxrwx---. 1 user user 0 Feb 9 10:45 /tmp/tmux-1000/default 

Как я могу увидеть ожидающие данные в сокете и как узнать, переполнен ли сокет?

2 Solutions collect form web for “Как просмотреть количество ожидающих данных в соке домена unix?”

Я не думаю, что так работают сокеты. Вы продолжаете читать до тех пор, пока он не будет пустым, размер не будет передаваться через сокет, и я не знаю, что он отображается в любом месте сокета, созданного в файловой системе /tmp/tmux-1000/default .

выдержка

Часто задаваемые вопросы о Unix Socket – 2. Вопросы, касающиеся как клиентов, так и серверов (TCP / SOCK_STREAM)

Я не думаю, что write () может законно вернуть 0. read () должен возвращать 0 при получении FIN от однорангового узла и ко всем следующим вызовам.

Итак, вы должны ожидать, что read () вернет 0.

Источник: Unix Socket Часто задаваемые вопросы

Также, если вы посмотрите, как часто выполняется чтение из сокета, вы, по существу, некоторое while (true) цикл, непрерывно читаете, пока соединение не будет явно прекращено. У вас нет способа узнать, сколько данных ожидает в сокете.

выдержка

 while ( true ) { unsigned char packet_data[256]; unsigned int maximum_packet_size = sizeof( packet_data ); ... 

Источник: ОТПРАВКА И ПОЛУЧЕНИЕ ПАКЕТОВ

Поэтому, чтобы ответить на ваш вопрос, единственный способ узнать, сколько данных находится в сокете, – это прочитать все это!

Рекомендации

  • 3.1. Общий обзор файловой системы Linux
  • Типы файлов Unix
  • Разделение домена Unix

Я боюсь, что ответ slm (в настоящее время отмеченный как правильный) неверен на нескольких фронтах.

Во-первых, ОП задал вопрос, есть ли способ сказать, вне зависимости от того, были ли в процессе получены данные в сокете AF_UNIX. Ответ slm требует модификации самого процесса. Как правило, netstat полезен при внешнем изучении процесса, над которым вы не можете контролировать поведение. Может быть полезно знать, имеет ли процесс непрочитанные данные, что может указывать на то, что процесс не правильно обслуживает его сокет с помощью чтения (т. Е. Может быть, он имеет ошибку или неправильно сконфигурирован, или поток умер).

Во-вторых, slm указывает, что вы не можете сделать это даже внутри процесса, за исключением чтения сокета, пока он не будет пустым. Также неправильно. Процесс может использовать SIOCINQ/FIONREAD ioctl для определения того, сколько данных ожидает в сокете, не читая его (я предпочитаю FIONREAD , потому что он означает одно и то же в других контекстах и, таким образом, более общепризнан, чем SIOCINQ , что является специфическим для Розетки). См. Справочную страницу unix (7) .

Наконец, в Linux фактически есть способ сделать то, что фактически запросил ОП ( извне обнаружить количество данных, ожидающих домены в unix-домене), используя программу ss , а не netstat . ss -ax сделает трюк. Это похоже на netstat на стероиды. См. Справочную страницу ss (8) .

Рекомендации

  • Unix Domain Socket Man Page (unix (7))
  • ss Страница служебного пользователя (ss (8))
  • Ввод в ss (ss.html)
  • Как сделать вызов .bashrc в зависимости от установленной программы tmux?
  • Правильно удалите сокеты, случайно созданные с помощью tmux
  • Создать новое окно с текущим каталогом в tmux
  • Systemd с rtorrent в tmux
  • установка tmux на Ubuntu 8.04
  • несоответствие версии протокола (клиент 8, сервер 6) при попытке обновления
  • привязка ключа tmux к содержимому панели панели программы
  • Как мне перемещаться по панелям внутри окна в tmux, как на экране?
  • zsh: установить TERM = screen-256color в tmux, но xterm-256color без tmux
  • Как заставить tmux-окно быть заданным размером
  • сервер стоп-узлов в tmux
  • Как завершить сеанс tmux и процессы, которые он породил
  • Linux и Unix - лучшая ОС в мире.