我试图将连续运行的程序的输出重定向到文件说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时,这会结束循环.
>它逐行工作,而不是行组.