2009-08-10 69 views
1

我創建了一個小型Bash腳本來執行MySQL數據轉儲。由於轉儲可能相當大,因此我將該進程置於後臺,然後等待出現錯誤或日誌顯示在文件系統中。我有以下代碼:將STDERR重定向到Bash文件中會導致即使沒有錯誤也會創建文件。爲什麼?

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工作,以爲檢查一0的文件大小將成爲更深層次問題的創可貼。 – null 2009-08-10 18:21:32

+4

問題不在於「STDERR如何工作」。這是shell重定向的工作原理。 – 2009-08-10 18:24:42

5

重定向的文件是在執行shell執行腳本之前設置的。

I.e.在分析了包含重定向stdout/stderr的命令後,shell分支會打開(如果文件不存在,則創建文件)。將打開的文件描述符附加到filedescriptor 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 
相關問題