シェルスクリプトでMySQLからの警告メッセージを抑制しますが、エラーを許可します


10

基礎となるいくつかのMySQLコマンドを使用してシェルスクリプトを実行しているときに、ログファイルが次のメッセージでダンプされます。

ここにメッセージがあります:

「警告:コマンドラインインターフェースでのパスワードの使用は安全でない場合があります。」

これらのメッセージを停止するには、次のジョブ定義を使用しています。

例:

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

これは機能しましたが、MySQLエラーはに記録されていませんoutput.log

次のように定義を変更すると、MySQLエラーが表示され始めます

run_wrapper.sh > output.log 2>&1

では、問題は警告メッセージを抑制し、cron定義のみを使用してログファイルにSQLエラーを報告する方法です。


おそらくあなたが使うべきだrun_wrapper.sh >> output.log 2>&1
Rahul

1
フォローしていません。エラー/警告をどこに送り、出力をどこに送り、何を捨てたいですか?パスワード警告を生成しているものは何ですか?また、MySQLに修正したくないエラーがあるのはなぜですか?
クサラナンダ

1
-pコマンドラインでオプションを使用すると、mysqlはその警告を出力します。それを修正する代わりに(たとえば~/.my.cnf、600パーマを作成することによって)、OPは警告(およびその警告のみ、stderrのすべてではない)を無視して破棄したい
cas

回答:


25

bashスクリプトで、上部で編集します

export MYSQL_PWD=yourdbpassword

とmysqlのように: mysql -u username -h host db -e "statement"

参照:Stackoverflowに投稿された回答から。他の回答もフォローできます。


2

次のようなラッパーで行を検索します

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

そしてに変更

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

これは警告の原因を解決します。


これは理にかなっています:-) Thx!
Mike Q

1

それ自体からstderrリダイレクトが欠落しているようですrun_wrapper.shので、エラーは発生していませんgrepログファイルを、そこからも。

stdoutsdterrの両方をログファイルに書き込んでよければ、代わりにこれを試してください

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

または、ログファイルに書き込まれたエラーのみが必要で、stdoutが呼び出し側端末に書き込みを残したい場合は、これを試してください

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

0

これを試して:

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

プロセス置換を介してstderrをにリダイレクトしgrep -v ...、そこからの出力に>> toれますoutput.log

おそらく(GNU)grep--line-bufferedオプションを使用し-v、エラー出力が遅延しないようにする必要があります。


ログファイルの後処理が許容できるオプションである場合は、不要な「警告:」行をログファイルから削除できます。 run_wrapper.sh完了。

次のシェルスクリプトフラグメントは、実行前に$tsログファイル(内$lf)のタイムスタンプ(内)を保存し、sed -i後でそれを復元します。

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"

ログファイルのiノードを保持する必要がある場合(ハードリンクがあるためなど)、次のed代わりに使用します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"

ご回答ありがとうございます。私は以下のような提案されたオプションを試しました
jagadish puvvada

sedオプションは空白行を作成し、それらも削除する必要があり、ファイルのタイムスタンプも変更します
jagadish puvvada

post-process-with-sedオプションは、タイムスタンプだけでなくiノードも変更します。これは通常のことです-i(ほとんどの形式の「インプレース編集」です)。直後に実行する場合は、マイクロ秒または秒のみ異なる必要があります。もちろん、ログファイルのサイズによって異なりますが、d(行の削除)コマンドで空白行sed作成されることはありません。つまり、正確にはどういう意味ですか?
cas

@jagadishpuvvada sedオプションは、output.logのタイムスタンプを保存および復元するようになりました。
cas

0

コマンドの最後にこれを追加してみてください:

/ dev / null 2>&1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.