Найдите, что процесс на другом конце трубы

Я пытаюсь отследить какое-то странное поведение нескольких процессов и столкнулся с тем, что не знаю, как отследить прошлое. Зависший процесс, который я прикрепил к использованию 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 может помочь, но я никуда не попал.

Есть идеи?

3 ответа

Решение

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

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

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

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

lsof | grep 'FIFO.*20043922'

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

Я бы использовал px.

Отказ от ответственности: я написал это, поэтому, конечно, рекомендую.

pxсообщит вам, с какими другими процессами разговаривает ваш,sudo px 7926дал бы тебе ответ.

Пример вывода (очевидно, не ваш PID, но все же), прокрутите вниз для трассировки каналов:

      ~ $ sudo px 76572
cat

kernel(0)               root
  launchd(1)            root
    iTerm2(39341)       johan
      iTerm2(39343)     johan
        login(39344)    root
          -fish(39346)  johan
----------> cat(76572)  johan

14.62s ago cat was started, at 2020-09-12T16:20:12+02:00.

Other processes started close to cat(76572):
  CoreServices/mdworker_shared(76468) was started 4m32s before cat(76572)
  CoreServices/mdworker_shared(76475) was started 4m02s before cat(76572)
  CoreServices/mdworker_shared(76541) was started 1m55s before cat(76572)
  cat(76573) was started just after cat(76572)
  sudo px(76583) was started 14.0s after cat(76572)

Users logged in when cat(76572) started:
  johan

2020-09-12T16:20:26.739132: Now invoking lsof, this can take over a minute on a big system...
2020-09-12T16:20:27.052847: lsof done, proceeding.

Others sharing this process' working directory (/Users/johan)
  cat(76573)
  -fish(39346)
  iTerm2(39343)
  login(39344)
  sudo px(76583)

File descriptors:
  stdin : [CHR] /dev/ttys000
  stdout: [PIPE] -> cat(76573) (0x204c1334a30aa50d)
  stderr: [CHR] /dev/ttys000

Network connections:

Inter Process Communication:
  cat(76573): [PIPE] ->0x204c1334a30aa50d

For a list of all open files, do "sudo lsof -p 76572", or "sudo watch lsof -p 76572" for a live view.
~ $
Другие вопросы по тегам