Szukam czegoś, co, jak podejrzewam, nie istnieje: nieblokowana buforowana nazwana potok (fifo) do użytku z wiersza poleceń. Czy jest coś takiego?
Oto przypadek użycia: Załóżmy, że mam proces, który będzie działał przez długi czas w tle i wyrzuci wiele wyników stdout
. Tak naprawdę nie dbam o wynik i nie chcę go przechowywać (być może nie mam wystarczająco dużo miejsca), ale chciałbym okresowo „wpaść” i śledzić, co robi, a następnie zrezygnować ponownie i zostaw to do wykonania. Chciałbym więc przekierować swoje wyjście do tej teoretycznie buforowanej, nieblokującej nazwanej potoki, a następnie okresowo się z nią korzystać.
Zasadniczo chcę zacząć w ten sposób ( 10M
ponieważ jest to rozmiar bufora):
mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
... i okresowo przychodzę, aby zobaczyć, co się dzieje ...
tail -f magicfifo
... bez magicfifo
zapisywania wszystkich danych wyjściowych (więc nie jest to zwykły plik) i bez blokowania procesu wyrzucania, gdy się zapełnia i nie jest podsłuchiwany (więc nie całkiem normalna nazwana rura).
Nie sądzę, aby rozwiązania obejmowały tail
lub zrobiłyby prune
to (cóż, mogę wymyślić obejście obejmujące tail
), ponieważ tail
nadal wymagałoby to przechowywania gdzieś wszystkich danych (jeśli chcę wpaść i zrezygnować z patrzenia na nie), i prune
musi przepisać plik, prawdopodobnie (przyznam, że tego nie próbowałem / nie udowodniłem), przerywając przekierowanie procesu generującego wszystkie dane wyjściowe.
Spodziewam się, że mógłbym napisać jakieś narzędzie do tego, ale * nix ma tak wiele fajnych aspektów plików i potoków, i tak, po prostu nie mogę przestać myśleć, że to istnieje i po prostu o tym nie wiem.
Więc: czy istnieje coś takiego, a jeśli tak, to co to jest?
źródło
Odpowiedzi:
Myślę, że szukasz GNU
screen
. Utrzymuje bufor, aby pomieścić ostatni ekran pełny lub dwa wyjścia z jednego lub więcej programów i umożliwia rozłączenie i powrót później.źródło
tmux
idtach
- cokolwiek w tej samej klasie terminali / aplikacji do zarządzania sesją powinno być w stanie osiągnąć to samo.Możesz użyć
pv
, zapewnia tyle buforowania, ile chcesz w potoku. Możesz użyć tego w następujący sposób:Dałoby to do 1 GB buforowania między
spewingprocess
i fifo. Większość dystrybucji Linuksa oferujepv
pakiet zwany, wierz lub niepv
,.źródło
Miałem ten sam problem. To jest moje pierwsze rozwiązanie. Najpierw zapisz dane wyjściowe do pliku, który obcinamy po każdej linii, aby nie wzrastał w nieskończoność:
Następnie odczytaj z pliku za pomocą tail (gdzie
2> /dev/null
pozbywa się komunikatu o błędzie „plik obcięty”):W ten sposób bufor nie rośnie i możemy multipleksować, np. Uruchamiać tyle ogonów, ile chcemy. Jednak problem z tym podejściem polega na tym, że możemy utracić dane, gdy obciemy się szybciej niż ogon może odczytać, jak pokazuje ten test:
Po dłuższym uruchomieniu pierwsza i ostatnia linia to:
Ale plik ma mniej wierszy, więc niektóre są tracone:
Mimo to wydaje się to dobrym rozwiązaniem, jeśli nie przejmujesz się tak bardzo utratą danych lub gdy proces wyrzucania nie jest wystarczająco szybki, aby nastąpiła utrata danych.
źródło