Sopprime i messaggi di avviso da MySQL nello script della shell ma consente errori


10

I miei file di registro vengono scaricati con il seguente messaggio durante l'esecuzione di script shell utilizzando alcuni comandi MySQL sottostanti.

Ecco il messaggio:

"Avviso: l'utilizzo di una password nell'interfaccia della riga di comando può essere insicuro."

Per interrompere questi messaggi, sto usando la seguente definizione di lavoro.

Esempio:

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

Funzionava ma gli errori MySQL non venivano registrati output.log.

Se cambio la definizione come segue, allora se presenti errori MySQL iniziano a comparire

run_wrapper.sh > output.log 2>&1

Quindi la domanda è: come eliminare i messaggi di avviso e segnalare anche errori SQL nei file di registro usando solo la definizione cron?


probabilmente dovresti usarerun_wrapper.sh >> output.log 2>&1
Rahul il

1
Non sto seguendo. Dove vorresti che arrivassero errori / avvisi e dove vorresti andare l'output e cosa vorresti buttare via? Cosa sta generando l'avvertenza della password e perché si verificano errori in MySQL che non si desidera correggere?
Kusalananda

1
mysql stampa questo avviso quando si utilizza l' -popzione sulla riga di comando. Invece di risolverlo (ad esempio creando un ~/.my.cnfcon 600 permanenti) l'OP vuole semplicemente ignorare e scartare l'avvertimento (e solo quell'avvertimento, non tutto di stderr)
cas

Risposte:


25

Nel tuo script bash, modificalo in alto

export MYSQL_PWD=yourdbpassword

e query mysql come: mysql -u username -h host db -e "statement"

Riferimento: dalla risposta pubblicata su StackOverflow . Altre risposte possono anche essere seguite.


2

cerca una riga nel tuo wrapper simile a

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

e passare a

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

questo risolve la fonte dell'avvertimento.


Questo ha senso :-) Grazie!
Mike Q,

1

Sembra che ti manchi il reindirizzamento stderr da run_wrapper.shsolo, quindi gli errori non passano attraverso il grepfile di registro.

Prova invece se sei felice di avere sia stdout che sdterr scritti nel tuo file di log

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

Oppure, se vuoi solo gli errori scritti nel file di registro e stdout ha lasciato la scrittura sul terminale chiamante, prova questo

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

0

Prova questo:

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

Reindirizzamenti STDERR via Sostituzione di processo a grep -v ..., e l'uscita da che viene aggiunto con >>aoutput.log

Probabilmente si desidera utilizzare l' opzione (GNU) grepe assicurarsi che l'output dell'errore non sia ritardato.--line-buffered-v


Se la post-elaborazione del file di registro è un'opzione accettabile per te, puoi semplicemente eliminare le righe "Avvertenza:" indesiderate dal file di registro al run_wrapper.shtermine.

Il frammento di script di shell seguente salva il timestamp (in $ts) del file di registro (in $lf) prima di eseguirlo sed -ie lo ripristina in seguito:

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"

Se è necessario conservare l'inode del file di registro (ad es. Perché ha collegamenti fissi), utilizzare edanziché 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"

Grazie per la risposta. Ho provato l'opzione suggerita come di seguito
jagadish puvvada

L'opzione sed crea righe vuote e dobbiamo anche rimuoverle e cambia anche il timestamp del file
jagadish puvvada

L'opzione post-process-with-sed cambia anche l'inode e il timestamp - questo è normale per -i(e la maggior parte delle forme di "modifica sul posto"). Se eseguito immediatamente dopo, dovrebbe essere diverso solo per microsecondi o secondi, a seconda delle dimensioni del file di log, naturalmente, ma non c'è modo a. ddi comando (linea di eliminazione) in sedsarà di creare una linea vuota - che cosa vuoi dire con questo?
cas

L' sedopzione @jagadishpuvvada ora salva e ripristina il timestamp di output.log.
CAS

0

Prova ad aggiungere questo alla fine del tuo comando:

/ dev / null 2> & 1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.