monitorować ruch rurociągów międzyprocesowych


13

Mam dwa procesy Linuksa komunikujące się za pomocą bezimiennego potoku. Jak monitorować ruch w rurze? Jak mogę wstrzyknąć dane do potoku? Mam dostęp do katalogu głównego i znam i-węzeł potoku.

Odpowiedzi:


7

Rura bez nazwy jest z natury prywatna dla aplikacji, które mają deskryptor pliku. Nie ma zasadniczego sposobu obserwowania lub modyfikowania ruchu na rurze. Nie sądzę też, aby można było spojrzeć na potok bezpośrednio w systemie Linux.

Istnieje jednak prosty sposób robienia mniej więcej tego, czego szukasz: poprzez wywołanie systemowe ptrace . Nie przylgnąłbyś do rury jako takiej, ale do jednego z procesów. Do obserwacji użyj strace , np

strace -p1234 -s99999 -e write

gdzie 1234jest identyfikatorem procesu, który zapisuje na potoku. Modyfikowanie danych jest trudniejsze, ale można to zrobić. Myślę, że najprościej byłoby najpierw skonfigurować proces pośredni, który kopiuje standardowe dane wejściowe na standardowe dane wyjściowe, a także dane, które chcesz wstrzyknąć (i pomniejszone o dane, które chcesz ukryć). Utwórz dwie nazwane rury i rozpocznij ten pośredni proces ze stdin na jednej rurze i stdout na drugiej. Następnie użyj debuggera (np. GDB ), aby oba procesy docelowe były wykonywane openna odpowiednio nazwanym potoku, a następnie dupumieść potok na odpowiednim deskryptorze pliku. Pamiętaj, że istnieje ryzyko, że zawiesisz jeden z procesów w tym procesie.

(Jeśli nie rozumiesz ostatniego akapitu, przepraszam, ale wymaga pewnego poziomu techniki. Nie sądzę, że istnieje łatwiejszy sposób.)


Dzięki, rozumiem. W rzeczywistości próbowałem / proc / $ PID / fd, gdzie znalazłem wpisy pliku dla nienazwanych potoków jednego z procesów i udało mi się odczytać i dane za pomocą prostego cat i echa w powłoce, ale zachowanie nieco niespójny. Muszę zbadać dalej.
jackhab

1
@jackhab: Oh, myślałem, że to nie działa na rury. Ale jak się dowiedziałeś, nie pomoże ci to zbytnio w monitorowaniu ruchu, ponieważ każdy bajt od producenta trafi dokładnie do jednego konsumenta i nie możesz kontrolować, czy monitor lub faktyczny konsument go otrzyma. Powinieneś być w stanie wstrzyknąć dane w ten sposób.
Gilles „SO- przestań być zły”

2

Niektóre narzędzia przydatne do monitorowania potoku:

Rura Viewer
tee

W przypadku już działającego programu, w którym nie kontroluje się potokowania, zobacz metodę gdb:
Przekierowanie danych wyjściowych z uruchomionego procesu .

Lub można użyć strace :

strace -ewrite -p $PID 2>&1 | grep "write(1"

pokazuje tylko wywołania deskryptora 1. „2> i 1” oznacza przekierowanie stderr na stdout, ponieważ strace domyślnie zapisuje na stderr.


1
Chodziło mi o podsłuchiwanie rurki już uruchomionego procesu. Proces A uruchamia proces B i rozmawia z nim za pomocą potoku, więc nie mam możliwości korzystania z narzędzi proxy, takich jak tee lub pv.
jackhab

Dodano kilka innych metod.
harrymc

Zamiast używać grep, możesz podać „-e write = 1”, aby ograniczyć dane wyjściowe do danych zapisanych do fd 1.
William Pursell,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.