Jak mogę kontynuować czytanie z rury, nawet po jej zamknięciu?

5

Mam skrypt ksh, który wywołuje:

while read LINE do...

Dane wejściowe zostały przekierowane (nie pokazano), dzięki czemu można odczytać dane wejściowe z potoku.

Problem polega na tym, że gdy piszący do potoku zamyka się, read zwraca false i wychodzi z pętli.

Chcę, aby nadal czytał po zamknięciu potoku (proces pisania może się od czasu do czasu uruchamiać ponownie, powodując taką sytuację).

Próbowałem owijać całą LINIĘ do odczytu w podpowłokę i zapętlać całą podpowłokę, ale czytać po prostu otrzymuje pustą linię po zamknięciu potoku zamiast blokować, dopóki nie będzie więcej danych wejściowych, jak ma to miejsce przy normalnym uruchomieniu skryptu.

davidparks21
źródło

Odpowiedzi:

6

W jądrze tworzony jest potok jako metoda komunikacji między dwoma procesami. Zazwyczaj jest to związek rodzic / dziecko. Jeśli proces się zakończy, nie ma rury. Nie ma sposobu, aby dołączyć inny proces do drugiego końca potoku w jądrze. Jądro automatycznie rozpoczyna zamykanie potoku i przekazuje EPIPE wszystkim czytelnikom.

Co można zrobić, choć jest utworzyć nazwanego potoku . Istnieje w systemie plików i nie jest zamykany po wyjściu z dowolnego programu piszącego. Możesz nawet mieć wielu pisarzy na potoku, choć nie sugeruję tego - „fragmenty”, które, jak myślisz, piszą, są zapisywane w różnych częściach z powodu buforowania.

Tworzysz potok w znanym katalogu za pomocą mkfifo /path/to/pipei przekierowujesz stdin lub stdout z / do niego, w zależności od tego, czy jesteś czytelnikiem czy pisarzem.

Rich Homolka
źródło
0

Po zamknięciu rury nie można jej ponownie otworzyć. Nie znam wszystkich szczegółów dotyczących nazwanych potoków w systemie plików, ale jeśli robisz coś takiego, cat somefile.txt | myprogramgdy tylko catzamkniesz potok, potok zniknie.

Darth Android
źródło
>nie jest fajką. Jest to specyfikator przekierowania wyjścia.
amfetamachina
@amphetamachine: Whooops. Dzięki za złapanie tego
Darth Android