Vraag Is er een manier om output om te leiden naar een bestand zonder buffer op unix / linux?


Ik heb een langlopend batchproces dat wat foutopsporings- en procesinformatie uitvoert naar stdout. Als ik gewoon van een terminal ren, kan ik 'waar het is' volgen, maar dan krijgen de gegevens te veel en verdwijnen er scrollen van het scherm.

Als ik doorverwijs naar uitvoer naar een bestand '> out.txt' krijg ik de hele uitvoer uiteindelijk maar het is gebufferd, dus ik kan niet meer zien wat het nu aan het doen is.

Is er een manier om de uitvoer om te leiden, maar ervoor te zorgen dat deze zijn taken niet opslaat?


46
2017-07-26 14:34


oorsprong


Zou je alsjeblieft een kijkje willen nemen in mijn (en @ cnst's) "debat" hieronder, ik vermoed dat het enige dat je wilt is om de uitvoer in dezelfde tijd te zien als het naar een bestand te loggen. Als u een oplossing hebt gevonden, laat het ons weten;)! - Benj
meer opgestoken vraag unix.stackexchange.com/questions/25372 - Trevor Boyd Smith


antwoorden:


U kunt de bufferingsopties van de standaardstreams expliciet instellen met behulp van a setvbuf c bellen (zie deze link), maar als u probeert het gedrag van een bestaand programma aan te passen, probeer het dan stdbuf (deel van coreutils beginnend met versie 7.5 blijkbaar).

Dit buffert stdout tot een regel:

stdbuf -oL command > output

Dit schakelt uit stdout volledig bufferen:

stdbuf -o0 command > output

46
2017-07-27 15:41



aaarghhh ... Mijn Ubuntu heeft slechts 7.4 coreutils ... :( - Calmarius
@Calmarius: het verzamelen van kerntitels zou vrij eenvoudig moeten zijn. Pak gewoon een nieuwe versie van ftp.gnu.org/gnu/coreutils en probeer het eens. Het is standaard ./configure && make tarief. U hoeft het niet eens achteraf te installeren, u kunt gewoon de stdbuf binair uit src/. - Eduardo Ivanec
dubbele argh. ik heb dit nodig op een oude centos distro EN OSX evenals Ubuntu. - edk750
meer upvoted antwoord unix.stackexchange.com/a/25378/5510 - Trevor Boyd Smith


U kunt regelgebufferde uitvoer naar een bestand verkrijgen met behulp van de script commando als volgt:

stty -echo -onlcr   # avoid added \r in output
script -q /dev/null batch_process | tee output.log        # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log   # Linux
stty echo onlcr

8
2018-01-31 15:13



-1 omdat: a) in tegenstelling tot het geaccepteerde antwoord dit niet werkt als u de opdracht op de achtergrond wilt uitvoeren (de opdracht wordt onmiddellijk beëindigd zonder afwerking batch_process als je toevoegt & naar het bovenstaande commando, althans op mijn Linux-box), wat een extreem veel voorkomende use-case lijkt, en b) er is hier geen uitleg over hoe deze incantatie werkt. - Mark Amery


Op Ubuntu, de unbuffer programma (van de expect-dev) pakket heeft de truc voor mij gedaan. Ren gewoon:

unbuffer your_command 

en het zal het niet bufferen.


7
2018-02-18 11:48





De gemakkelijkste oplossing die ik vond (geen geïnstalleerde pakketten van derden nodig had) werd vermeld in een soortgelijke thread over op op Unix en Linux site: gebruik de script commando. Het is oud en is waarschijnlijk al geïnstalleerd.

$ script -q /dev/null long_running_command | print_progress       # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress  # Linux

Let daar op de eerste bestandsnaamparameter voor de script opdracht is het logbestand dat moet worden geschreven. Als je gewoon rent script -q your_command, overschrijft u de opdracht die u hebt ingesprongen om met het logbestand uit te voeren. Controleren man script, om veilig te zijn, voordat je het probeert.


4
2018-04-17 03:57





probeer de script commando; als je systeem het heeft, is er een bestandsnaam als argument nodig, alle tekst gedumpt naar stdout wordt gekopieerd naar het bestand. Het is erg handig wanneer een installatieprogramma interactie vereist.


2
2017-07-26 14:49



Ik ken de truc 'script -a out.txt'. Ik vroeg me af of er een andere manier is om het schrijfproces niet te bufferen. - James Dean


Persoonlijk geef ik de voorkeur aan de uitvoer van een commando dat ik wil doornemen tee.

script registreert te veel informatie, inclusief de timing van toetsaanslagen en veel niet-afdrukbare tekens. Wat tee opslaan is veel menselijker leesbaar voor mij.


2
2017-07-26 14:51



Ik zou ook "| less" toevoegen aan de opdrachtregel. - HUB
Ik ben er vrij zeker van dat tee wordt ook beïnvloed door buffering. Ik krijg vaak nog steeds gedeeltelijke regels weergegeven op tee bij het splitsen van de uitvoer van find commando's. - Magellan


Leid de uitvoer om naar een bestand en volg het bestand met de tail -f commando.

Bewerk

Als dit nog steeds lijdt aan buffering, gebruik dan de syslog-faciliteit (die over het algemeen niet gebufferd is). Als het batchproces als een shellscript wordt uitgevoerd, kunt u de logboekopdracht gebruiken om dit te doen. Als de batchtaak in een scripttaal wordt uitgevoerd, moet er hoe dan ook een logfunctie zijn.


1
2017-07-26 16:47



Dit is wat ik nu doe, maar het proces buffert het schrijven naar het bestand en dat is precies wat ik wil vermijden. - James Dean
Zie mijn bewerking voor een bijgewerkt voorstel. - wolfgangsz
Dit werkt niet om voor de hand liggende redenen. Wie verdomme geeft het This answer is useful voor antwoorden die niet werken en niet kunnen werken? - cnst


U kunt de tee commando, gewoon magie!

someCommand | tee logFile.log zullen beide in de console weergeven en in het logbestand schrijven.


0
2018-04-26 12:32



Werkt niet. tee stopt niet met bufferen. - cnst
@cnst effectief, tee zal sommige buffering niet vermijden, maar zal u alleen toestaan ​​om een ​​blik te werpen op wat de uitvoer is. Dit is wat @JamesDean wilde (terwijl ik zijn vraag ongedaan maakte), maar ik denk dat buffering hier niet echt het probleem is. Laat het me weten als je meer informatie hebt. - Benj
Hij wilde output zien, en hij krijgt geen output (op een ongebufferde manier), en toch stel je voor om te gebruiken tee om een ​​beter beeld te krijgen van de uitvoer die men niet krijgt? - cnst
Hoe ik rode @JamesDean-vraag: "Ik leid door naar uitvoer naar een bestand '> out.txt'" betekent voor mij geen console-uitvoer, wacht tot het proces is voltooid terwijl de volledige uitvoer wordt omgeleid. Wanneer u gebruikt > je ziet niets op de console. Ik neem aan dat @JamesDean het woord 'buffering' gebruikt om dat te beschrijven. Ik zal een opmerking over zijn vraag posten zodat hij meer kan vertellen over wat hij wil. - Benj