代码之家  ›  专栏  ›  技术社区  ›  null

即使没有错误,在bash文件中重定向stderr也会导致创建一个文件。为什么?

  •  1
  • null  · 技术社区  · 15 年前

    我创建了一个小型的bash脚本来执行MySQL数据转储。因为转储可能相当大,所以我将进程放在后台,然后等待错误或日志出现在文件系统中。我有以下代码:

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

    问题是我得到了一个'/loc/to/error/log/file.log'文件,大小为0(我认为这意味着没有真正的错误),有时当运行这个命令时,它会终止进程,即使没有错误。

    我不知道为什么stderr会在没有数据可写的情况下写一个文件。这是因为 & 背景流程?

    3 回复  |  直到 8 年前
        1
  •  0
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

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

        2
  •  5
  •   nos    15 年前

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

    也就是说,在解析了包含重定向stdout/stderr的命令之后,shell分叉,打开(如果文件不存在,则创建文件)。将打开的文件描述符附加到文件描述符1和2(分别为stdout/err),然后执行实际命令。

        3
  •  0
  •   Mtl Dev Bryan Oakley    8 年前

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

    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