Как я могу получить больше информации об открытых каналах в / proc в Linux?

53

В Linux, если вы /proc/<pid>/fdбудете часто копаться, вы увидите вывод:

lrwx------ 1 root root 64 Jul 30 15:14 0 -> /dev/null
lrwx------ 1 root root 64 Jul 30 15:14 1 -> /dev/null
l-wx------ 1 root root 64 Jul 30 15:14 10 -> pipe:[90222668]
lr-x------ 1 root root 64 Jul 30 15:14 11 -> pipe:[90222669]
l-wx------ 1 root root 64 Jul 30 15:14 13 -> pipe:[90225058]
lr-x------ 1 root root 64 Jul 30 15:14 14 -> pipe:[90225059]

Как я могу получить больше информации об открытых каналах, например, какой процесс находится на другом конце?

Камил Кисиэль
источник
Таким образом, поиск в целом /procпроисходит медленно. Может ли кто-нибудь предложить более эффективное решение?
pihentagy

Ответы:

46

Похоже на другие ответы, но:

lsof | grep 90222668

Покажет вам оба конца, потому что оба конца разделяют «номер трубы».

Кайл Брандт
источник
3
Ах, конечно. Работает как положено. Вы даже можете указать номер дескриптора файла, который является читателем, а кто - автором, посмотрев на четвертый столбец вывода!
Камил Кисиэль
Я думаю, что это число может быть номером инода канала для pipef, которые вы не можете смонтировать. Я ищу способ получить inode для сопоставления имен файлов, но это может быть лучшим способом. Кстати, я люблю этот вопрос :-)
Кайл Брандт
Почему-то это не работает для меня. Все это выводит сама труба.
Руи Маркес
запуск lsof от имени обычного пользователя может не дать вам информацию обо всех процессах. Обычно у вас нет разрешения видеть каталог всех процессов / proc / <pid> / fd как пользователь без полномочий root.
Андре Хольцнер
5
Кроме того, вы можете использовать его, lsof -n -P | grep 90222668чтобы избежать ненужных поисков имен, что должно ускорить его.
Водин
4

Единственный способ узнать, какой процесс находится на другом конце, - это перебрать все процессы в / proc и посмотреть, кто использует этот канал (т. Е. У которых есть символические ссылки в / proc / pid / fd на тот же идентификатор канала)

bdonlan
источник
Спасибо за чаевые. Один из способов автоматизировать это: ls -l /proc/*/fd/ | grep $PIPE_ID; ls -l /proc/*/fd/$FD | grep $PIPE_ID первая команда ls напечатает файловые дескрипторы обоих концов канала, а вторая даст вам идентификатор процесса
Joao Costa
2

Больше всего информации о том, как добраться до открытых труб, я знаю

lsof|grep FIFO

Боюсь, до сих пор рассказывается только об одном конце.

хаос
источник
Это примерно так же, как я могу предугадать из / proc, я предполагаю, что lsof получает его из того же места.
Камил Кисиэль