【问题标题】:STDERR redirection to log file breaks on log file deletion删除日志文件时将 STDERR 重定向到日志文件中断
【发布时间】:2012-08-28 00:12:30
【问题描述】:

有一个用 C 语言开发的在 unix 环境下运行的服务器代码,服务器将 STDOUT/STDERR 重定向到日志如下

static gboolean
create_log_file (const char *log_file)
{
  int log_file_fd;

  g_return_val_if_fail (log_file != NULL, FALSE);

  log_file_fd = open (log_file, O_WRONLY|O_CREAT|O_TRUNC, 0644);

  if (log_file_fd < 0)
    {
      return FALSE;
    }

  dup2 (log_file_fd, 1);
  dup2 (log_file_fd, 2);

  close (log_file_fd);

  return TRUE;
}

计划为此日志文件设置归档/清除 cron,以确保磁盘使用量在限制范围内。

日志记录工作得非常好,直到清除 cron 启动并删除日志文件。

观察到 cron 运行后日志文件删除,STDERR 跟踪停止并且不再创建文件?

【问题讨论】:

  • 服务器打印到 STDERR 的内容曾经完美地出现在日志文件中,直到我删除日志文件。发布到 STDERR 的打印结果都没有出现在日志文件中?请注意,当文件被删除时,服务器正在运行并继续运行。

标签: c redirect stderr


【解决方案1】:

一旦打开,文件描述符将保持与您在函数调用时传递给open(2) 的名称指定的文件的关联。如果您稍后从磁盘中删除该文件,您取消链接它与该名称,但该文件将一直存在,直到所有对它的引用都消失了。

删除文件后,您的程序是唯一剩余的引用持有者。程序将继续写入文件,但您不能再命名该文件。出于安全原因,内核实际上不希望您能够重新获得此类拖欠文件的名称,并且您无法在不修改操作系统的情况下取回它们(有一个 Linux 内核模块启用这样的僵尸复活,但我怀疑 Windows 有类似的东西)。当您的程序结束时,该文件最终被永久删除。

【讨论】:

  • 感谢 Kerrek,您有什么建议可以让 cron 存档日志,并在服务器打印到 STDERR 时清除文件,而日志文件中继续显示。
  • @sashidharballagiri:您可以在每次登录时关闭并重新打开文件,或者登录到内部缓冲区并以类似方式刷新日志。
  • 或者设计您的应用程序以通过关闭和重新打开文件来响应特定信号,这是一种相当常见的 *nix-ish 模式。
  • 谢谢Kerrek/Twalberg,会尝试这个建议。
猜你喜欢
  • 2017-05-31
  • 2011-11-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2015-03-11
  • 2011-01-31
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多