2011-12-21 4 views
1

J'ai un script de base qui génère divers messages d'état. par exemple.Rediriger la sortie des scripts enfants Bash

~$ ./myscript.sh 
0 of 100 
1 of 100 
2 of 100 
... 

Je voulais envelopper dans un script parent, afin d'exécuter une séquence d'enfants-scripts et envoyer un e-mail à la fin d'ensemble, par exemple topscript.sh

#!/bin/bash 
START=$(date +%s) 
/usr/local/bin/myscript.sh 
/usr/local/bin/otherscript.sh 
/usr/local/bin/anotherscript.sh 
RET=$? 
END=$(date +%s) 
echo -e "Subject:Task Complete\nBegan on $START and finished at $END and exited with status $RET.\n" | sendmail -v [email protected] 

Je suis en cela comme:

~$ topscript.sh >/var/log/topscript.log 2>&1 

Cependant, quand je lance tail -f /var/log/topscript.log pour inspecter le journal que je ne vois rien, même si en cours d'exécution supérieure montre myscript.sh est actuellement en cours d'exécution et, par conséquent, produisant vraisemblablement des messages d'état.

Pourquoi le stdout/stderr des scripts enfants n'est-il pas capturé dans le journal des parents? Comment puis-je réparer ça?

EDIT: Je les exécute également sur une machine distante, connectée via ssh en utilisant une allocation pseudo-tty, par ex. ssh -t [email protected]. Le pseudo-tty pourrait-il interférer?

+1

Si la réponse de l'abri ci-dessous n'aide pas, vous pouvez essayer de réduire où cela ne va pas. Quelques choses à essayer: (1) Est-ce que './myscript.sh> tmp.log 2> & 1' écrit dans' tmp.log'? Sinon, c'est peut-être en vérifiant [[-t 1]] 'et en n'écrivant que des messages lorsque la sortie standard est un téléscripteur. (2) Une fois 'topscript.sh' terminé, voyez-vous des messages dans le journal? (En d'autres termes, est-ce juste qu'ils sont retardés? C'est ce que l'abri et les réponses d'un seul suggère.) – ruakh

Répondre

1

essayer

unbuffer topscript.sh >/var/log/topscript.log 2>&1 

Notez que Unbuffer n'est pas toujours disponible comme binaire std dans le vieux style plates-formes Unix et peuvent nécessiter une recherche et l'installation d'un package pour le soutenir.

J'espère que cela aide.

2

Je viens d'essayer votre suivantes: J'ai trois fichiers t1.sh, t2.sh et t3.sh tout avec le contenu suivant:

#!/bin/bash 

for((i=0;i<10;i++)) ; do 
    echo $i of 9 
    sleep 1 
done 

Et un script appelé myscript.sh avec les éléments suivants contenu:

#!/bin/bash 

./t1.sh 
./t2.sh 
./t3.sh 

echo "All Done" 

Quand je lance ./myscript.sh > topscript.log 2>&1 puis dans une autre course terminale tail -f topscript.log je vois les lignes étant sortie très bien dans le fichier journal. Peut-être que les choses exécutées dans vos indices utilisent un tampon de sortie important? Je sais que quand j'ai déjà exécuté des scripts python, il y a un gros tampon de sortie, donc vous ne voyez aucune sortie pendant un moment. Est-ce que vous voyez réellement la sortie entière dans l'email qui est envoyé à la fin de topscript.sh? Est-ce juste que pendant que les processus fonctionnent, vous ne voyez pas la sortie?