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