Suprimir mensagens de aviso do MySQL no shell script, mas permitir erros


10

Meus arquivos de log estão sendo despejados com a seguinte mensagem ao executar scripts de shell usando alguns comandos subjacentes do MySQL.

Aqui está a mensagem:

"Aviso: o uso de uma senha na interface da linha de comandos pode ser inseguro."

Para interromper essas mensagens, estou usando a seguinte definição de trabalho.

Exemplo:

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

Isso funcionou, mas os erros do MySQL não estão sendo registrados output.log.

Se eu mudar a definição da seguinte forma, os erros do MySQL começarão a aparecer, se houver

run_wrapper.sh > output.log 2>&1

Portanto, a questão é como suprimir as mensagens de aviso e também relatar erros SQL nos arquivos de log usando apenas a definição cron.


provavelmente você deve usarrun_wrapper.sh >> output.log 2>&1
Rahul

1
Eu não estou seguindo. Para onde você deseja que os erros / avisos sejam enviados e para onde você deseja que os resultados sejam enviados e o que você gostaria de jogar fora? O que está gerando o aviso de senha e por que você possui erros no MySQL que não deseja corrigir?
Kusalananda

1
O mysql imprime esse aviso quando você usa a -popção na linha de comando. Em vez de corrigi-lo (por exemplo, criando um ~/.my.cnfcom 600 perms) o OP quer simplesmente ignorar e descartar o aviso (e somente esse aviso, nem todos stderr)
cas

Respostas:


25

No seu script bash, edite-o na parte superior

export MYSQL_PWD=yourdbpassword

e consulta mysql como: mysql -u username -h host db -e "statement"

Referência: da resposta publicada no Stackoverflow . Outras respostas também podem ser seguidas.


2

procure uma linha no seu invólucro semelhante a

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

e mude para

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

isso resolve a fonte do aviso.


Isso faz sentido :-) Thx!
Mike Q

1

Parece que você está perdendo o redirecionamento stderrrun_wrapper.sh , então os erros não estão passando pelo greparquivo de log e daí para ele.

Tente fazer isso se desejar que stdout e sdterr sejam gravados no seu arquivo de log

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

Ou se você deseja apenas os erros gravados no arquivo de log e o stdout deixou de gravar no terminal de chamada, tente este

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

0

Tente o seguinte:

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

Redireciona o stderr via Substituição de Processo para grep -v ...e a saída disso é anexada >>aoutput.log

Você provavelmente vai querer usar (GNU) grep's --line-bufferedopção, bem como -vpara tornar a saída certeza erro não está atrasado.


Se o pós-processamento do arquivo de log for uma opção aceitável, você poderá excluir as linhas "Aviso:" indesejadas do arquivo de log após a run_wrapper.shconclusão.

O seguinte fragmento de script de shell salva o registro de data e hora (in $ts) do arquivo de log (in $lf) antes da execução sed -ie o restaura posteriormente:

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 você precisar preservar o inode do arquivo de log (por exemplo, porque possui links físicos), use em edvez de 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"

Obrigado pela resposta. Eu tentei a opção sugerida como abaixo
puvvada jagadish

opção sed cria linhas em branco e precisamos removê-los também e isso muda timestamp arquivo também
puvvada jagadish

A opção pós-processo-com-sed também altera o inode e o carimbo de data e hora - isso é normal para -i(e para a maioria das formas de edição "in-loco"). Se for executado imediatamente depois, deve ser apenas microssegundos ou segundos diferentes, dependendo do tamanho do arquivo de log, claro, mas não há nenhuma maneira a. dcomando (linha de exclusão) em sedvai criar uma linha em branco - o que exatamente você quer dizer com isso?
cas

A sedopção @jagadishpuvvada agora salva e restaura o registro de data e hora do output.log.
cas

0

Tente adicionar isso ao final do seu comando:

/ dev / null 2> & 1

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.