Znajdź proces na drugim końcu rury

34

Próbuję wyśledzić dziwne zachowanie kilku procesów i natrafiłem na punkt, który nie jestem pewien, jak prześledzić przeszłość. Zawieszony proces, do którego się przyłączyłem, strace -ppokazał:

Process 7926 attached - interrupt to quit
read(3, 

Okej, więc czeka na wejście na FD 3, więc poszedłem sprawdzić, co to jest:

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

Okej, więc to fajka ... teraz pytanie - kto jest autorem tej fajki? Pamiętam, że w systemie Linux istnieje specjalna funkcja dla gniazd domeny unix, w której można zażądać ścieżki pliku, która zaczyna się bajtem NUL, aby uzyskać dostęp do „abstrakcyjnej przestrzeni nazw gniazd” (wspomnianej tutaj: http://tkhanson.net/cgit.cgi /misc.git/plain/unixdomain/Unix_domain_sockets.html ). Nie jestem pewien, czy istnieje coś podobnego do rur, z którego mógłbym skorzystać, ale niczego nie znalazłem.

Miałem nadzieję, że narzędzie takie fuserlub lsofmoże pomóc, ale nigdzie nie dotarłem.

Jakieś pomysły?

Błąd krytyczny
źródło

Odpowiedzi:

32

Treść dowiązania symbolicznego „potok: [20043922]” jest unikalnym identyfikatorem; drugi koniec potoku będzie miał pasujący identyfikator.

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

powinien pokazywać oba końce rury.

Kyle Jones
źródło
1
Dobre myślenie, dzięki! Podczas dochodzenia natknąłem się również na ten wątek tutaj serverfault.com/questions/48330/…, więc pomyślałem, że też zostawię tutaj link tylko dla innych.
FatalError
2

Możesz uzyskać listę procesów za pomocą potoku za pomocą lsofpolecenia:

lsof | grep 'FIFO.*20043922'

Dane wyjściowe pokażą czytniki (w kolumnie FD z wpisami jak 1r) i pisarzy (te same kolumny z wpisami jak 2w).

Eugen
źródło