将程序的输出重定向到旋转文件

Redirecting output of a program to a rotating file

我正在尝试将连续运行程序的输出重定向到文件error_log

我正在使用的命令如下所示,其中 myprogram.sh 不断运行生成数据并写入 /var/log/httpd/error_log

现在我正在使用 logrotate 每小时轮换此文件。我在 logrotate 中使用 create 命令,以便它重命名原始文件并创建一个新文件。 logrotate 配置看起来像

/var/log/httpd/error_log {
# copytruncate
 create
 rotate 4
 dateext
 missingok
 ifempty
 .
 .
 .
}

但是这里重定向失败了。我想要的是 myprogram.sh 将数据写入 error_log 文件,而不管它是否被 logrotate 旋转,显然是新生成的 error_log 文件

知道如何根据 文件名 not 描述符 [=42= 使重定向工作吗] ?

在 bash 中还有其他方法吗?

如果我理解你的问题,一种解决方案(无需修改 myprogram.sh)可能是:

$ myprogram.sh | while true; do head -10 >> /var/log/httpd/error_log; done

解释:

  • myprogram.sh 写入标准输出
  • 我们通过管道 |.
  • 将此输出重定向到 while bash 句子
  • while true 是一个永远不会结束的无限循环,即使 myprogram.sh 结束也应该打破管道。
  • 在每个循环中调用 head 命令将从管道读取的前 10 行附加到当前 /var/log/httpd/error_log 文件的末尾(这可能与上一个循环不同,因为 logrotate).

(您可以更改每个循环中写入的行数)

另一种方式是:

$ myprogram.sh | while read line; do echo "$line" >> /var/log/httpd/error_log; done
  • 这与第一个非常相似,但这会在 myprogram.sh 结束或关闭标准输出时结束循环。
  • 它逐行工作,而不是成组地工作。