2009-08-10 7 views
1

私は、MySQLのデータダンプを行う小さなBashスクリプトを作成しました。ダンプがかなり大きくなる可能性があるので、プロセスをバックグラウンドに置き、エラーまたはログがファイルシステムに表示されるのを待ちます。BashファイルでSTDERRをリダイレクトすると、エラーがなくてもファイルが作成されます。どうして?

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

問題は、私は「/loc/to/error/log/file.logが0のサイズのファイルを得るということです(私は推測本当のエラーを意味しない)時には:私は、次のコードを持っていますこのコマンドが実行され、エラーがなくてもプロセスを強制終了します。

書き込みするデータがないときにSTDERRがファイルを書き込む理由がわかりません。これは&バックグラウンドプロセスのためですか?

答えて

0

リダイレクトファイルは、データが書き込まれたかどうかにかかわらず作成されます。どちらのプロセスがエラーログを見ているのかは、ファイルサイズがゼロでないことを確認する必要があります。

+0

さて、私はSTDERRが働いていた、とAのチェックと思ったのか分かりませんでしたファイルサイズが0の場合は、深刻な問題のための手助けとなります。 – null

+4

問題は「STDERRのしくみ」ではありません。シェルのリダイレクトがどのように機能するかです。 –

5

リダイレクトされたファイルは、スクリプトが実行シェルによって実行される前に設定されます。

I.e.リダイレクトされたstdout/stderr(シェルフォーク)を含むコマンドを解析した後、openss(ファイルが存在しない場合は作成されます)が開きます。開かれたファイル記述子をファイル記述子1と2(stdout/err)に添付し、実際のコマンドを実行します。

0

可能簡単な回避策:

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

OR
(タイムスタンプが短い読める容易に調整スクリプト)

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