16 votes

Tee ne reçoit pas toute la sortie du tube

J'ai un script qui exécute des commandes comme :

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Nombre d'erreurs : $(grep "ERROR" $LOG | wc -l)"

Le problème est probablement dans le pipe vers tee. Il semble ne pas obtenir la totalité de la sortie. Lorsque l'application se termine, les dernières lignes de la sortie (généralement celles contenant une erreur fatale) sont manquantes. Quand j'exécute l'application sans le pipe vers tee, je les obtiens dans la sortie.

Comment puis-je forcer le script à attendre que tee ait terminé le traitement de toute la sortie?

28voto

Mufaka Points 54

L'erreur fatale sort probablement en STDERR (2), pas en STDOUT (1). Vous pouvez rediriger STDERR vers STDOUT avec 2>&1 et ensuite le tube devrait aussi le capturer.

./some_app -i $INDEX 2>&1 | tee $LOG

Si vous avez des problèmes de mise en mémoire tampon en plus, vous pourriez le forcer à passer à un état non mis en mémoire tampon :

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG

7voto

heemayl Points 85741

Comme les messages d'erreur sont normalement affichés sur STDERR (Descripteur de fichier 2), vous devez rediriger à la fois le STDOUT et STDERR vers tee :

./some_app -i "$INDEX" |& tee "$LOG"

Lorsque vous faites ./some_app -i $INDEX | tee $LOG vous ne redirigez que le STDOUT vers tee.

|& permet de rediriger à la fois le STDOUT et STDERR.

Si vous voulez rediriger seulement le STDOUT (comme vous l'étiez) :

./some_app -i "$INDEX" | tee "$LOG"

En revanche, si vous voulez rediriger seulement le STDERR :

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"

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