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.

jackhab
źródło

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.)

Gilles „SO- przestań być zły”
źródło
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.

harrymc
źródło
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,