bash nonblocking citanie cez pipe

Sekcia: Programovanie 21.06.2008 | 15:55
Avatar Tomi Windows XP Pro/Ubuntu  Používateľ
ahoj,
mam skript, ktory ide "bez zastavenia", a ktory vypisuje priebezne nejaky vystup...nazvime ho
./foo.py
a ja chcem nejak grepnut vysledky... lenze ked dam:
./foo.py|grep foo
tak sa caka, kym program neskonci(a ja nekonecne vela casu nemam ;-]) a az potom grepuje...
ako mam donutit grep, aby hned grepoval?
Nobody is perfect. I am Nobody.
    • Re: bash nonblocking citanie cez pipe 21.06.2008 | 16:02
      WlaSaTy   Návštevník
      v tom skripte sa neda splachnut , napriklad takto?
      sys.stdout.flush()
      • Re: bash nonblocking citanie cez pipe 21.06.2008 | 16:21
        Avatar Tomi Windows XP Pro/Ubuntu  Používateľ
        noo da sa to tak "splachnut" :D

        za co ti aj dakujem, lebo o flush() som nevedel ;)
        ale mna to taktiez zaujima kusa vseobecnejsie... nie viazane na python...
        ved ked mam nejaky skript, tak standardny vystup mi vypisuje _hned_, cize teoreticky imho ma pipe ihned k dipozicii ten vystup...preco s nim nerobi?:(
        Nobody is perfect. I am Nobody.
        • Re: bash nonblocking citanie cez pipe 21.06.2008 | 16:33
          Avatar Tomi Windows XP Pro/Ubuntu  Používateľ
          mimochodom, ako sa na to teraz pozeram, vznikla mi celkom pekna anomalia v kode:

          1. pseudoterminal:
          mkfifo pipe
          ./count_up.py > pipe
          

          2. pseudoterminal:
          tomi@tomi-desktop:~/data/develop/bash/pipes$ cat < pipe
          0
          2
          4
          6
          8
          
          3.pseudoterminal:
          tomi@tomi-desktop:~/data/develop/bash/pipes$ cat < pipe
          1
          3
          5
          7
          9
          


          a na zaver skript count_up.py:
          tomi@tomi-desktop:~/data/develop/bash/pipes$ cat count_up.py 
          #!/usr/bin/python
          
          import time
          import sys
          
          for i in range(10):
          	time.sleep(1)
          	print i
          	sys.stdout.flush()
          


          vysvetli mi to prosim niekto, preci mi na obe pseudoterminaly nedalo rovnaky vystup?:(
          Nobody is perfect. I am Nobody.
          • Re: bash nonblocking citanie cez pipe 21.06.2008 | 16:48
            WlaSaTy   Návštevník
            aka anomalia? pipe nie je perpetum mobile ktore da na vystupe viac ako dostane zo vstupu.
            • Re: bash nonblocking citanie cez pipe 21.06.2008 | 17:49
              Avatar Tomi Windows XP Pro/Ubuntu  Používateľ
              noo mohlo aspon na oba vystupy dat to iste, a nie striedat, ze kazdy druhy vystup pojde na jeden terminal...
              Nobody is perfect. I am Nobody.
              • Re: bash nonblocking citanie cez pipe 21.06.2008 | 19:37
                WlaSaTy   Návštevník
                toco ti vojde do fifo socketu, to z neho aj vyjde. a vyjde to raz tak ako to voslo.
                • Re: bash nonblocking citanie cez pipe 22.06.2008 | 15:33
                  Avatar Tomi Windows XP Pro/Ubuntu  Používateľ
                  jop,
                  ale aj tak nerozumiem par veciam:

                  1) preco sa mi vystup neposle dalej, kym nepouzijem metodu flush() ?
                  ved ked nepouzivam pipe, tak mi to ide _hned_ na standardny vystup...
                  pipe by mala predsa dostavat vysledky okamzite...
                  resp. ako sa to da spravit napr. v C++ ? da sa to nejak spravit vseobecne, aby sa vystup odosielal hned, nezavisle an programe?(lebo to potrebujem)

                  2) da sa nejak spravit, aby som mal program foo.py a nejak posielal vystup VIACERYM - N programom na vstup? ale nejak elegantnejsie, vytvorit N rur?
                  Nobody is perfect. I am Nobody.
                  • Re: bash nonblocking citanie cez pipe 22.06.2008 | 18:47
                    WlaSaTy   Návštevník
                    1) skus sa zamysliet nad opotrebenim a rychlostou hardware keby sa zapisovalo po kazdom jednom bajte. tento caching je implenentovany na viacerych vrstvach a vypinat ho nema vyznam.

                    2) ak chces aby program zasielal informacie viacerym programom, tak nepouzi zapis do jednej trubky. Ak chces, pouzi viacero rur alebo si urob tcpip server ktory bude tu jednu vec zasielat vsetkym pripojenym klientom alebo cez broadcast...