Question Existe-t-il un moyen de rediriger la sortie vers un fichier sans mettre en tampon sur unix / linux?


J'ai un long processus de traitement par lots qui génère des informations de débogage et de processus sur stdout. Si je viens de courir depuis un terminal, je peux garder une trace de «où il se trouve», mais les données deviennent trop volumineuses et font défiler l'écran.

Si je redirige la sortie vers un fichier '> out.txt', je récupère éventuellement la totalité de la sortie, mais celle-ci est mise en mémoire tampon afin que je ne puisse plus voir ce qu'elle fait actuellement.

Existe-t-il un moyen de rediriger la sortie sans l’empêcher de mettre ses écritures en mémoire tampon?


46
2017-07-26 14:34


origine


Pourriez-vous s'il vous plaît jeter un oeil à mon (et au @cnst) "débat" ci-dessous, je suppose que la seule chose que vous voulez, c'est voir la sortie en même temps que la journalisation dans un fichier. Si vous avez trouvé une solution, faites-le nous savoir;)! - Benj
question plus votée unix.stackexchange.com/questions/25372 - Trevor Boyd Smith


Réponses:


Vous pouvez définir explicitement les options de mise en mémoire tampon des flux standard à l’aide d’un bouton. setvbuf appeler en C (voir ce lien), mais si vous essayez de modifier le comportement d'un programme existant, essayez stdbuf (partie de coreutils à partir de la version 7.5 apparemment).

Ce tampons stdout jusqu'à une ligne:

stdbuf -oL command > output

Cela désactive stdout mettre en tampon tout à fait:

stdbuf -o0 command > output

46
2017-07-27 15:41



aaarghhh ... Mon Ubuntu n'a que 7.4 coreutils ... :( - Calmarius
@Calmarius: la compilation de coreutils devrait être assez facile. Il suffit de saisir une nouvelle version de ftp.gnu.org/gnu/coreutils et essayez-le. C'est standard ./configure && make tarif Vous n'avez même pas besoin de l'installer après, vous pouvez simplement utiliser le stdbuf binaire désactivé src/. - Eduardo Ivanec
double argh. J'ai besoin de cela sur une ancienne distribution centos ET OSX, ainsi que sur Ubuntu. - edk750
réponse plus votée unix.stackexchange.com/a/25378/5510 - Trevor Boyd Smith


Vous pouvez obtenir une sortie en mémoire tampon de ligne dans un fichier en utilisant le script commande comme ceci:

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 parce que: a) contrairement à la réponse acceptée, cela ne fonctionne pas si vous voulez exécuter la commande en arrière-plan (la commande se termine immédiatement sans terminer batch_process si vous ajoutez & à la commande ci-dessus, du moins sur ma machine Linux), ce qui semble être un cas d'utilisation extrêmement courant, et b) il n'y a pas d'explication ici sur le fonctionnement de cette incantation. - Mark Amery


Sur Ubuntu, le unbuffer programme (de la expect-dev) forfait a fait le tour pour moi. Il suffit de courir:

unbuffer your_command 

et ça ne va pas le tamponner.


7
2018-02-18 11:48





La solution la plus simple que j'ai trouvée (aucun logiciel tiers requis n'a été installé) a été mentionnée dans un fil de discussion similaire à l'adresse suivante: Unix et Linux site: utilisez le script commander. Il est vieux et probablement déjà installé.

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

Notez que le premier paramètre de nom de fichier pour le script commande est le fichier journal à écrire. Si vous courez simplement script -q your_command, vous écraserez la commande que vous avez mise en retrait avec le fichier journal. Vérifier man script, pour être en sécurité, avant de l'essayer.


4
2018-04-17 03:57





essaie le script commander; si votre système en dispose, il prend un nom de fichier en argument, tout le texte vidé sur stdout est copié dans le fichier. C'est très utile lorsqu'un programme d'installation nécessite une interaction.


2
2017-07-26 14:49



Je connais le truc 'script -a out.txt'. Je me demandais s'il existe un autre moyen de rendre le processus d'écriture non tampon. - James Dean


Personnellement, je préfère la sortie d'une commande que je veux examiner à travers tee.

script enregistre trop d'informations, y compris le minutage des appuis sur les touches et de nombreux caractères non imprimables. Quoi tee save est beaucoup plus lisible pour moi.


2
2017-07-26 14:51



J'ajouterais aussi "| less" à la ligne de commande. - HUB
Je suis à peu près sûr que tee est également affecté par la mise en mémoire tampon. Il arrive souvent que des lignes partielles apparaissent en té lors de la division de la sortie de find commandes. - Magellan


Rediriger la sortie dans un fichier et suivre le fichier avec le tail -f commander.

modifier

Si le problème persiste, utilisez la fonction syslog (généralement non tamponnée). Si le processus de traitement par lots s'exécute en tant que script shell, vous pouvez utiliser la commande logger pour ce faire. Si le travail par lots s'exécute dans un langage de script, il devrait néanmoins exister une fonction de journalisation.


1
2017-07-26 16:47



C’est ce que je fais maintenant mais le processus tamponne l’écriture dans le fichier et c’est ce que je veux éviter. - James Dean
Voir mon édition pour une proposition mise à jour. - wolfgangsz
Cela ne fonctionne pas pour des raisons évidentes. Qui diable donne This answer is useful pour des réponses qui ne fonctionnent pas et ne peuvent éventuellement pas fonctionner? - cnst


Vous pouvez utiliser le tee commande, juste magique!

someCommand | tee logFile.log volonté tous les deux afficher dans la console et écrire dans le fichier journal.


0
2018-04-26 12:32



Ça ne marche pas tee n'empêchera pas la mise en mémoire tampon. - cnst
@cnst efficacement, tee n'évitera pas la mise en mémoire tampon mais vous permettra seulement de jeter un coup d'œil sur la sortie. C’est ce que @JamesDean voulait (car j’ai bien compris sa question), mais je pense que la mise en mémoire tampon n’est pas vraiment le problème ici. Si vous avez plus de détails, faites le moi savoir. - Benj
Il voulait voir la sortie, et il ne reçoit aucune sortie (de manière non tamponnée), et pourtant vous suggérez d'utiliser tee pour obtenir une meilleure vue de la sortie que l'on ne reçoit pas? - cnst
Comment je réponds à la question @JamesDean: "Je redirige la sortie vers un fichier '> out.txt'" signifie pour moi aucune sortie de console, attendez que le processus soit terminé pendant que toute la sortie est redirigée. Quand vous utilisez > vous ne voyez rien sur la console. Je suppose que @JamesDean utilise le mot "mise en mémoire tampon" pour décrire cela. Je posterai un commentaire sur sa question pour qu'il puisse en dire plus sur ce qu'il veut. - Benj