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

我试图将连续运行的程序的输出重定向到文件说error_log.

我使用的命令看起来像这样,myprogram.sh连续生成数据并写入/ var / log / httpd / error_log

> myprogram.sh>>在/ var /日志/的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文件

知道如何根据文件名而不是描述符进行重定向工作吗?

要么

在bash中执行此操作的任何其他方式?

最佳答案 如果我理解你的问题,一个解决方案(没有修改myprogram.sh)可能是:

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

解释:

> myprogram.sh写入stdout
>我们通过管道将此输出重定向到bash句子.
>虽然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结束或关闭它的stdout时,这会结束循环.
>它逐行工作,而不是行组.

点赞