gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:25:48 25 4
gpt4 key购买 nike

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

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

  • myprogram.sh >>/var/log/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 写入标准输出
  • 我们通过管道 | 将此输出重定向到 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 结束或关闭它的标准输出时结束循环。
  • 它逐行工作,而不是成组地工作。

关于linux - 将程序的输出重定向到旋转文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com