Supprimer les messages d'avertissement de MySQL dans le script shell, mais autoriser les erreurs

Mes files journaux sont vidés avec le message suivant lors de l'exécution des scripts shell en utilisant certaines commands MySQL sous-jacentes.

Voici le message:

"Avertissement: l'utilisation d'un mot de passe sur l'interface de command line peut être peu sûre."

Pour arrêter ces messages, j'utilise la définition de travail suivante.

Exemple:

run_wrapper.sh |grep -v "Warning: Using a password" > output.log 2>&1 

Cela a fonctionné mais les erreurs MySQL ne sont pas enregistrées dans output.log .

Si je change la définition comme suit, les erreurs MySQL commencent à apparaître si

 run_wrapper.sh > output.log 2>&1 

La question est donc de savoir comment supprimer les messages d'avertissement et signaler les erreurs SQL dans les files journaux en utilisant uniquement la définition cron?

Dans votre script bash, éditez-le en haut

 export MYSQL_PWD=yourdbpassword 

et requête mysql comme: mysql -u username -h host db -e "statement"

Référence: De la réponse postée à Stackoverflow . D'autres réponses peuvent également être suivies.

Essaye ça:

 lf='output.log' > "$lf" # first truncate/create the logfile. run_wrapper.sh >> "$lf" 2> >(grep -v "Warn.*passw.*insec" >> "$lf") 

Redirige stderr via la substitution de process à grep -v ... , et la sortie de celle-ci est ajoutée avec >> à output.log

Vous souhaiterez probablement utiliser l'option --line-buffered (GNU) grep ainsi que -v pour vous assurer que la sortie d'erreur n'est pas retardée.


Si le post-traitement du file journal est une option acceptable pour vous, vous pouvez simplement supprimer les lignes «Avertissement:» indésirables du file journal après l' run_wrapper.sh de run_wrapper.sh .

Le fragment de script shell suivant enregistre l'horodatage (dans $ts ) du file journal (dans $lf ) avant d'exécuter sed -i et le restaure ensuite:

 lf='output.log' run_wrapper.sh >& "$lf" ts=$(date -r "$lf" '+%Y%m%d%H%M.%S') sed -i -e '/Warning: Using a password/d' "$lf" touch -t "$ts" "$lf" 

Si vous devez conserver l'inode du file journal (par exemple parce qu'il a des liens durs), utilisez ed plutôt que sed :

 ts=$(date -r "$lf" '+%Y%m%d%H%M.%S') printf "%s\n" 'g/Warning: Using a password/d' w | ed -s "$lf" touch -t "$ts" "$lf" 

Il semble que vous run_wrapper.sh redirection stderr de run_wrapper.sh elle-même, de sorte que les erreurs ne passent pas par le grep et de là dans le file journal.

Essayez ceci plutôt si vous êtes heureux d'avoir à la fois stdout et sdterr écrit dans votre file journal

 run_wrapper.sh 2>&1 | grep -v "Warning: Using a password" > output.log 

Ou si vous voulez seulement les erreurs écrites dans le file journal, et stdout laissé écrire au terminal appelant, essayez ceci

 ( run_wrapper.sh 2>&1 1>&3 | grep -v "Warning: Using a password" > output.log ) 3>&1 

searchz une ligne dans votre emballage similaire à

 mysql -u<username> -p<some_password> -hlocalhost -D<database_name> 

et changer pour

 export MYSQL_PWD=<some_password> ; mysql -u<username> -hlocalhost -D<database_name> 

cela résout la source de l'avertissement.

Essayez d'append ceci à la fin de votre command:

/ dev / null 2> & 1