2009-08-10 9 views
1

J'ai créé un petit script Bash qui effectue un vidage de données MySQL. Parce que le vidage peut être assez important, je mets le processus en arrière-plan, puis j'attends une erreur ou le journal apparaît dans le système de fichiers. J'ai le code suivant:La redirection de STDERR dans un fichier Bash entraîne la création d'un fichier même s'il n'y a pas d'erreur. Pourquoi?

mysqldump main_db > /loc/to/dmp/file.sql 2>/loc/to/error/log/file.log & 

Le problème est que je reçois un fichier « /loc/to/error/log/file.log » la taille de 0 (que je suppose que signifie aucune erreur réelle) parfois, quand cette commande est exécutée, ce qui tue le processus, même s'il n'y a pas d'erreur. Je ne sais pas pourquoi le STDERR écrirait un fichier quand il n'y avait pas de données à écrire. Est-ce dû au processus d'arrière-plan &?

Répondre

0

Le fichier de redirection est créé que des données lui soient ou non écrites. Quel que soit le processus qui surveille le journal des erreurs, vérifiez que la taille du fichier n'est pas nulle, et non l'existence.

+0

D'accord, je ne sais pas comment fonctionnait STDERR, et la pensée vérification d'une taille de fichier de 0 serait un pansement pour un problème plus profond. – null

+4

Le problème n'est pas "comment fonctionne STDERR". C'est comme ça que fonctionnent les redirections de shell. –

5

Les fichiers redirigés sont configurés avant l'exécution de votre script par le shell en cours d'exécution.

I.e. après avoir analysé votre commande qui inclut redirigé stdout/stderr, les fers de shell, ouvre (crée les fichiers s'ils n'existent pas). attacher les filedescriptors ouverts aux filedescriptor 1 et 2 (stdout/err respectivly) puis exécute la commande actuelle.

0

Une possible solution facile:

mysqldump main_db > file.sql 2> errors.log ; [ -s errors.log ] || rm -f errors.log 

OU
(petit script lisible facilement réglable avec horodatage)

OUTPUT="/loc/to/dmp/`date +%F.%T`.sql" 
ERRORS="$OUTPUT.ERRORS" 
mysqldump main_db > $OUTPUT 2> $ERRORS 
[ -s $ERRORS ] || rm -f $ERRORS