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

时间:2016-12-23 19:24:44

标签: linux bash redirect logrotate

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

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

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

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

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

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

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

OR

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

1 个答案:

答案 0 :(得分:3)

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

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

解释

  • myprogram.sh写入stdout
  • 我们通过管道while将此输出重定向到| bash句子。
  • while true是一个无限循环,永远不会结束,即使myprogram.sh结束也会破坏管道。
  • 在每个循环中调用head命令,将从管道读取的前10行追加到当前/var/log/httpd/error_log文件的末尾(由于{{1},可能与最后一个循环不同})。

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

另一种方式是:

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