Nowe posty

Autor Wątek: Obsługa potoków  (Przeczytany 2933 razy)

Jendker

  • Gość
Obsługa potoków
« dnia: 2014-12-31, 15:46:10 »
Witam,

Problem jest banalny, starałem się znaleźć odpowiedź na to co może być nie tak, nie udało mi się, dlatego zadaję pytanie tutaj.

Mam za zadanie utworzenie potoku trzech poleceń i sprawdzenie otwartych plików procesów uczestniczących w potoku. Zrobiłem krótki skrypt wypisujący tekst na ze sleepem na 1 s. Tworząc potok w ten sposób nie pojawia się nic w pliku: ./petla | grep "" > pliktekst.txt, Natomiast bez ostatniego przekerowania, czyli tylko  ./petla | grep "" tekst pokazuje się w oknie terminala normalnie.

Starałem się znaleźć odpowiedź na to, ale bezskutecznie, czy mogę prosić o pomoc?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Obsługa potoków
« Odpowiedź #1 dnia: 2014-12-31, 21:59:38 »
> Mam za zadanie utworzenie potoku trzech poleceń

Na przykład:
1) $ cat /dev/urandom | hexdump | grep '1234 5'
2) $ cat | grep 'abc' | wc -l

^Z (Ctrl+Z) zatrzyma procesy, przywracanie poleceniem 'fg'.

> i sprawdzenie otwartych plików procesów uczestniczących w potoku.

$ ps
1) cat, hexdump, grep
2) cat grep, wc

$ ls -la /proc/1234/fd
$ ls -la /proc/1235/fd
$ ls -la /proc/1236/fd

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Obsługa potoków
« Odpowiedź #2 dnia: 2014-12-31, 23:05:08 »
Co do twojego problemu z zapisem outputu pętli do pliku:

Wynika on z tego, że jeśli wyjściem grepa jest plik, to grep domyślnie buforuje dane i wypluwa kiedy chce (jak widać nieprędko).
W momencie gdy polecenie przerwiesz Ctrl+C (sygnał SIGINT), grep też zostanie zabity zanim zdąży wypluć dane do pliku. Nie wiem czy to aby na pewno właściwe zachowanie, bo mógłby tę sytuację obsłużyć, ale tak jest.
Gdybyś zakończył skrypt pętli sygnałem SIGTERM (killall petla / kill pid_petli), wtedy grep wykryłby zamknięcie swojego wejścia (z pętli) i wypluł wyjście do pliku, a następnie sam się zakończył.

Aby zapobiec takiemu zachowaniu możesz zmusić grepa do buforowania co najwyżej pojedynczej linii:
./petla | grep --line-buffered '' > pliktekst.txt

Jendker

  • Gość
Obsługa potoków
« Odpowiedź #3 dnia: 2015-01-04, 23:41:34 »
Dzięki za pomoc :) dokładnie o to chodziło! Temat do zamknięcia.