我正在尝试将连续正在运行的程序的输出重定向到文件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中执行此操作的其他任何方式?
答案 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
结束或关闭它的标准输出时结束循环。