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 à partir d'un terminal, je peux garder une trace de «où il se trouve», mais les données deviennent trop volumineuses et disparaissent de l'écran.
Si je redirige la sortie vers un fichier '> out.txt', je récupère finalement 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?
Réponses:
Vous pouvez définir explicitement les options de mise en mémoire tampon des flux standard à l'aide d'un
setvbuf
appel en C (voir ce lien ), mais si vous essayez de modifier le comportement d'un programme existant, essayezstdbuf
(coreutils
apparemment à partir de la version 7.5).Cela tamponne
stdout
jusqu'à une ligne:Cela désactive
stdout
complètement la mise en mémoire tampon:la source
./configure && make
tarif standard . Vous n'avez même pas besoin de l'installer après, vous pouvez simplement utiliser lestdbuf
binaire offsrc/
.Vous pouvez obtenir une sortie mise en mémoire tampon dans un fichier en utilisant la
script
commande comme suit:la source
batch_process
si vous ajoutez&
à la commande ci-dessus, au moins sur ma machine Linux), ce qui semble comme un cas d'utilisation extrêmement courant, et b) il n'y a pas d'explication ici du fonctionnement de cette incantation.Sur Ubuntu, le
unbuffer
programme (à partir duexpect-dev
) package a fait l'affaire pour moi. Il suffit de courir:unbuffer your_command
et ça ne va pas le tamponner.
la source
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 sur les sites Unix et Linux : utilisez la
script
commande. Il est vieux et probablement déjà installé.Notez que le premier paramètre de nom de fichier de la
script
commande est le fichier journal à écrire . Si vous exécutez simplementscript -q your_command
, vous écraserez la commande que vous avez mise en retrait avec le fichier journal. Vérifiezman script
, pour être sûr, avant de l'essayer.la source
essayez la
script
commande; 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.la source
Personnellement, je préfère canaliser la sortie d'une commande que je souhaite examiner
tee
.script
enregistre trop d'informations, y compris le minutage des appuis sur les touches et de nombreux caractères non imprimables. Ce quitee
sauve est pour moi beaucoup plus lisible par l'homme.la source
tee
est également affecté par la mise en mémoire tampon. Souvent, je reçois toujours des lignes partielles affichées par té lors du fractionnement de la sortie desfind
commandes.Rediriger la sortie dans un fichier et suivre le fichier avec la
tail -f
commande.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 malgré tout y avoir une fonction de journalisation.
la source
This answer is useful
réponses qui ne fonctionnent pas et ne peuvent pas fonctionner?Vous pouvez utiliser la
tee
commande, tout simplement magique!someCommand | tee logFile.log
seront tous deux affichés dans la console et écrits dans le fichier journal.la source
tee
n'empêchera pas la mise en mémoire tampon.tee
n'empêchera pas une certaine mise en mémoire tampon mais vous permettra seulement de jeter un coup d'oeil sur ce qui est 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.tee
pour obtenir une meilleure vue de la sortie qu'elle ne reçoit pas?>
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.