30

Я пытаюсь отследить какое-то странное поведение нескольких процессов и столкнулся с тем, что не знаю, как отследить прошлое. Зависший процесс, который я подключил к использованию strace -p показал это:

Process 7926 attached - interrupt to quit
read(3, 

Итак, он ожидает ввода на fd 3, поэтому я пошел, чтобы проверить, что это такое:

$ ls -l /proc/7926/fd/3
lr-x------ 1 user grp 64 Mar 15 10:41 /proc/7926/fd/3 -> pipe:[20043922]

Итак, это труба ... теперь вопрос - кто автор этой трубы? Напомню, что в Linux есть специальная функция для доменных сокетов unix, где вы можете запросить путь к файлу, который начинается с байта NUL, для доступа к "абстрактному пространству имен сокетов" (упомянуто здесь: http://tkhanson.net/cgit.cgi/misc.git/plain/unixdomain/Unix_domain_sockets.html). Я не уверен, есть ли что-то подобное для труб, чем я мог бы воспользоваться, но я ничего не нашел.

Я надеялся, что такой инструмент, как fuser или lsof может помочь, но я никуда не попал.

Есть идеи?

2 ответа2

28

Содержимое символической ссылки "pipe:[20043922]" является уникальным идентификатором; другой конец канала будет иметь соответствующий идентификатор.

(find /proc -type l | xargs ls -l | fgrep 'pipe:[20043922]') 2>/dev/null

должен показать вам оба конца трубы.

0

Вы можете получить список процессов, используя канал, используя команду lsof :

lsof | grep 'FIFO.*20043922'

Выходные данные будут отображать читателей (в столбце FD с записями, такими как 1r) и пишущих (те же столбцы с записями, как 2w).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .