GNU/Linux >> Znalost Linux >  >> Linux

Sledovat, jak se něco zapisuje do souboru živě s ocasem

Možná budete také muset vyrovnávací paměť explicitně vyprázdnit, aby se při generování přenesla do potrubí. Je to proto, že výstup se obvykle tiskne pouze tehdy, když se vyrovnávací paměť roury zaplní (což je podle mého názoru v kilobajtech) a když zpráva stdin skončí. Pravděpodobně jde o úsporu čtení/zápisu. Můžete to udělat po každém tisku, nebo pokud provádíte smyčku, po posledním tisku v rámci smyčky.

import sys
...
print('Some message')
sys.stdout.flush()

Spusťte python s příznakem unbuffered:

python -u myprog.py > output.txt

Výstup se pak vytiskne v reálném čase.


Namísto pokusu o omezení živého souboru použijte tee namísto. Byla vytvořena, aby dělala přesně to, o co se snažíte.

Od pánského trička:

tee(1) – manuálová stránka systému Linux

Jméno tee - čtení ze standardního vstupu a zápis na standardní výstup a soubory

Souhrn

tee [OPTION]... [FILE]...

Popis

Zkopírujte standardní vstup do každého SOUBORu a také do standardního výstupu.

-a, --append  
   append to the given FILEs, do not overwrite  
-i, --ignore-interrupts  
   ignore interrupt signals   
--help  
   display this help and exit  
--version
   output version information and exit

Pokud je SOUBOR -, zkopírujte znovu na standardní výstup.

Ve vašem případě byste tedy spustili:

python myprog.py | tee output.txt

EDIT:Jak jiní zdůraznili, tato odpověď narazí na stejný problém, jaký měl OP, pokud není sys.stdout.flush() se používá v programu python, jak je popsáno v Daveyho přijaté odpovědi. Testování, které jsem provedl před odesláním této odpovědi, přesně neodráželo případ použití OP.

tee lze stále použít jako alternativní - i když méně než optimální - metodu zobrazení výstupu a zároveň zápisu do souboru, ale Daveyho odpověď je jednoznačně správná a nejlepší odpověď.


Linux
  1. Barvení výstupu ocasu pomocí Sed?

  2. Jak vytisknout soubor a ignorovat řádky, které začínají „?“?

  3. Jak zapíšu stderr do souboru při použití tee s potrubím?

  1. Jak si vyžádám soubor, ale neuložím jej pomocí Wget?

  2. Přesměrování výstupu příkazu do souboru a terminálu

  3. Chování rsync se souborem, který se stále zapisuje?

  1. Práce s Input Output a přesměrováním chyb v Linuxu

  2. Tail -f, určit, zda se do souboru již nezapisuje?

  3. Je bezpečné otevřít soubor, který je zapsán spuštěným skriptem?