Jak mogę uzyskać więcej informacji na temat wyświetlania otwartych potoków w / proc w systemie Linux?

53

W Linuksie, jeśli /proc/<pid>/fdczęsto się zagłębiasz, zobaczysz dane wyjściowe takie jak:

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]

Jak uzyskać więcej informacji o otwartych potokach, takich jak proces na drugim końcu?

Kamil Kisiel
źródło
Znalezienie w całości /procjest powolne. Czy ktoś może zapewnić bardziej skuteczne rozwiązanie?
pihentagy

Odpowiedzi:

46

Podobne do innych odpowiedzi, ale:

lsof | grep 90222668

Pokaże oba końce, ponieważ oba końce mają wspólny „numer potoku”.

Kyle Brandt
źródło
3
Ach, oczywiście. Działa zgodnie z oczekiwaniami. Możesz nawet powiedzieć numer deskryptora pliku i który koniec jest czytnikiem, a który piszącym, patrząc na czwartą kolumnę wyniku!
Kamil Kisiel
Myślę, że ta liczba może być liczbą i-węzłów potoku dla potoków, których nie można zamontować. Szukam sposobu, aby uzyskać i-węzeł mapowań nazw plików, ale może to być najlepszy sposób. Nawiasem mówiąc, uwielbiam to pytanie :-)
Kyle Brandt
Jakoś to nie działa dla mnie. Wszystko, co wyprowadza, to sama rura.
Rui Marques,
uruchamianie lsof jako standardowy użytkownik może nie podawać informacji ze wszystkich procesów. Zwykle nie masz uprawnień do wyświetlania katalogu wszystkich procesów / proc / <pid> / fd jako użytkownik inny niż root.
Andre Holzner,
5
Możesz także użyć tego, lsof -n -P | grep 90222668aby uniknąć niepotrzebnych wyszukiwań nazw, co powinno przyspieszyć.
Wodin
4

Jedynym sposobem na znalezienie procesu na drugim końcu jest zapętlenie wszystkich procesów w / proc i sprawdzenie, które używają tego potoku (tj. Które mają dowiązania symboliczne w / proc / pid / fd do tego samego ID potoku)

bdonlan
źródło
Dzięki za wskazówkę. Jednym ze sposobów na zautomatyzowanie tego jest: ls -l /proc/*/fd/ | grep $PIPE_ID; ls -l /proc/*/fd/$FD | grep $PIPE_ID Pierwsze polecenie ls wypisze deskryptory plików na obu końcach potoku, a drugie poda identyfikator procesu
Joao Costa
2

Najwięcej informacji, jakie znam na otwartych rurach, to

lsof|grep FIFO

Obawiam się, że wciąż mówi tylko o jednym końcu.

chaos
źródło
To mniej więcej tyle samo, ile mogę z boskiego / proc, mogę założyć, że lsof pobiera go z tej samej lokalizacji.
Kamil Kisiel