2009-08-10 65 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 
相关问题