71 votes

Existe-t-il un moyen de rediriger la sortie vers un fichier sans mise en mémoire tampon sous unix/linux ?

J'ai un processus de traitement par lots qui s'exécute sur une longue période et qui envoie des informations de débogage et de processus vers stdout. Si je l'exécute à partir d'un terminal, je peux savoir où il se trouve, mais les données deviennent trop nombreuses et défilent à l'écran.

Si je redirige la sortie vers un fichier '> out.txt', j'obtiens finalement toute la sortie mais elle est mise en mémoire tampon et je ne peux plus voir ce qu'elle fait en ce moment.

Y a-t-il un moyen de rediriger la sortie mais de faire en sorte qu'elle ne mette pas en mémoire tampon ses écritures ?

71voto

sjors miltenburg Points 694

Vous pouvez définir explicitement les options de mise en mémoire tampon des flux standard à l'aide de la commande setvbuf 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).

Cette mémoire tampon stdout jusqu'à une ligne :

stdbuf -oL command > output

Cela désactive stdout la mise en mémoire tampon :

stdbuf -o0 command > output

11voto

melder Points 109

Vous pouvez réaliser une sortie en tampon de ligne vers un fichier en utilisant la commande script comme suit :

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

10voto

Himanshu Shah Points 1

Sur Ubuntu, le unbuffer (du programme expect-dev ) a fait l'affaire pour moi. Il suffit de l'exécuter :

unbuffer your_command

et il ne le mettra pas en mémoire tampon.

6voto

MemphiZ Points 369

La solution la plus simple que j'ai trouvée (qui ne nécessitait pas l'installation de paquets tiers) a été mentionnée dans un fil de discussion similaire sur le site Unix et Linux site : utilisez le script commande. C'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 est le fichier journal à écrire . Si vous exécutez simplement script -q your_command vous écraserez la commande que vous avez indiqué en retrait pour l'exécuter avec le fichier journal. Vérifiez man script pour être sûr, avant de l'essayer.

4voto

frameworkninja Points 628

Essayez le script si votre système la possède, elle prend un nom de fichier comme argument, tout le texte envoyé à la sortie est copié dans le fichier. C'est très utile lorsqu'un programme d'installation nécessite une interaction.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X