1

我创建了一个执行 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 会写入文件。这是因为&后台进程吗?

4

3 回答 3

5

重定向文件是在执行 shell 执行脚本之前设置的。

即在解析了包含重定向的stdout/stderr 的命令后,shell 分叉,打开(如果文件不存在,则创建文件)。将打开的文件描述符附加到文件描述符 1 和 2(分别为标准输出/错误),然后执行实际命令。

于 2009-08-10T18:08:38.493 回答
0

无论是否曾向其写入任何数据,都会创建重定向文件。无论哪个进程正在查看错误日志,都应该检查非零文件大小,而不是存在。

于 2009-08-10T18:10:28.643 回答
0

一个可能的简单解决方法:

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


(带有时间戳的简短易读易调整脚本)

OUTPUT="/loc/to/dmp/`date +%F.%T`.sql"
ERRORS="$OUTPUT.ERRORS"
mysqldump main_db > $OUTPUT 2> $ERRORS
[ -s $ERRORS ] || rm -f $ERRORS
于 2016-04-01T08:29:27.027 回答