我创建了一个用于执行MySQL数据转储的小型Bash脚本。因为转储可能相当大,所以我将进程放在后台,然后等待错误或日志显示在文件系统中。我有以下代码:
mysqldump main_db > /loc/to/dmp/file.sql 2>/loc/to/error/log/file.log &
问题是我得到一个大小为0的'/loc/to/error/log/file.log'文件(我认为这意味着没有真正的错误),有时当这个命令运行时,这会杀死进程,即使没有错误。
我不确定为什么STDERR会在没有数据写入时写入文件。这是因为&
后台流程吗?
答案 0 :(得分:5)
重定向文件在执行shell执行脚本之前设置。
即。在解析了包含重定向的stdout / stderr的命令后,shell分叉打开(如果文件不存在则创建文件)。将打开的文件描述符附加到文件描述符1和2(分别为stdout / err),然后执行实际命令。
答案 1 :(得分:0)
无论是否有任何数据写入,都会创建重定向文件。无论哪个进程正在查看错误日志,都应检查非零文件大小,而不是存在。
答案 2 :(得分: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