将程序的输出redirect到旋转文件

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

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

  • myprogram.sh >> /var/log/httpd/error_log

现在我正在使用logrotate来每小时旋转这个文件。 我在logrotate使用create命令,以便重命名原始文件并创build一个新文件。 logrotateconfiguration看起来像

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

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

任何想法如何使redirect工作基于文件名不是 描述符

要么

任何其他方式在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结束或关闭它的stdout时,这会结束循环。
  • 它一行一行,而不是一组行。