我正在尝试将连续运行的程序的输出redirect到文件error_log
。
我正在使用的命令如下所示,其中myprogram.sh
将不断生成数据并写入/var/log/httpd/error_log
myprogram.sh >> /var/log/httpd/error_log
现在我正在使用logrotate
来每小时旋转这个文件。 我在logrotate
使用create
命令,以便重命名原始文件并创build一个新文件。 logrotate
configuration看起来像
/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时,这会结束循环。