bash: force exec avais processus de mémoire sans tampon stdout
J'ai un script tel que:
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
Problème est que some_binary
envoie tous ses journalisation vers la sortie standard, et de mise en mémoire tampon qu'il fait en sorte que je ne vois qu'une sortie en morceaux de quelques lignes. C'est ennuyeux quand quelque chose est coincé et j'ai besoin de voir ce que la dernière ligne dit.
Est-il possible de faire stdout sans tampon avant que je ne l'exec qui affectera some_binary de sorte qu'il est plus utile de l'exploitation forestière?
(Le script est seulement de quelques variables d'environnement avant le exec, une solution en perl ou python serait également envisageable.)
- Dennis réponse est tout à fait exact. Voici pourquoi. Programmes sur Unix qui utilisent C stdio pour la sortie de la mémoire tampon lors de la sortie est de ne pas aller à un terminal (améliore les performances de beaucoup) moins dit de ne pas avec
setvbuf
; presque personne ne s'en soucie. Leexpect
système (dontunbuffer
est une application standard) utilise la magie noire avec Unix pseudo-terminaux (pty-s) pour exécuter des programmes avec un terminal qui n'est pas un vrai terminal, de sorte que le enveloppés programme n'a pas de tampon de sa sortie. Il est intelligent, mais attention: la plupart des systèmes ont un nombre limité de pty-s; naturellement sans tampon programme est meilleur. - BTW, cela ne fonctionne pas si bien sur Windows. C'est parce que attendre sur cette plate-forme utilise le débogage de magie au lieu de la borne de la magie (car c'est un domaine où Windows est très différent).
- Merci. J'ai décidé d'opter pour la modification de
some_binary
de faire la bonne chose au lieu de compter sur la magie noire.expect
est grand, mais je ne veux pas de ça ici...
Vous devez vous connecter pour publier un commentaire.
Vous trouverez peut-être que le
unbuffer
script qui vient avecattendre
peut aider.echo -n .
ouprinff "."
dont j'ai besoin dans mon cas, pour afficher une barre de progression en bashGNU coreutils-8.5 a aussi le
stdbuf
de commande pour modifier les flux d'e/S de mise en mémoire tampon:http://www.pixelbeat.org/programming/stdio_buffering/
Donc, dans votre cas, il suffit de l'invoquer:
Cela permettra de faire apparaître le texte immédiatement, ligne par ligne (une fois qu'une ligne est terminée avec la fin-de-ligne
"\n"
de caractères en C). Si vous voulez vraiment immédiate de sortie, utilisez-o0
à la place.De cette façon pourrait être plus souhaitable si vous ne souhaitez pas introduire de dépendance à
attendre
viaunbuffer
de commande. Leunbuffer
manière que, d'autre part, est nécessaire si vous devez vous trompersome_binary
en pensant que c'est face à une véritable ats sortie standard.Certains programmes en ligne de commande ont une option pour modifier leur stdout flux de mise en mémoire tampon de comportement. Donc, c'est la voie à suivre si la source C est disponible ...
Comme une alternative à l'utilisation d'attendre de l'annuler les tampons de script ou de modifier le code source du programme, vous pouvez également essayer d'utiliser un script(1) pour éviter stdout hoquet causée par un tuyau:
Voir: Astuce une demande en pensant à son stdin est interactif, et non d'une pipe
script -q /dev/null commands... | perl -pe 's/\n/\r\n/g'
J'ai parcouru l'internet pour une réponse, et rien de cette travaillé pour
uniq
qui est trop têtu pour le tampon de tout, sauf pourstdbuf
:{piped_command_here} | stdbuf -oL uniq | {more_piped_command_here}
GNU Coreutils-8 inclut un programme appelé stdbuf qui fait essentiellement la LD_PRELOAD truc. Il fonctionne sur Linux et, apparemment, des travaux sur les systèmes BSD.
Une variable d'environnement peut définir le terminal IO mode sans tampon.
exportation NSUnbufferedIO=OUI
Ce sera fixé le terminal sans tampon en C et en Objectif-C-terminal les commandes de sortie.