将程序的输出重定向到旋转文件
Redirecting output of a program to a rotating file
我正在尝试将连续运行程序的输出重定向到文件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
文件
知道如何根据 文件名 和 not 描述符 [=42= 使重定向工作吗] ?
或
在 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
结束或关闭标准输出时结束循环。
- 它逐行工作,而不是成组地工作。
我正在尝试将连续运行程序的输出重定向到文件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
文件
知道如何根据 文件名 和 not 描述符 [=42= 使重定向工作吗] ?
或
在 bash 中还有其他方法吗?
如果我理解你的问题,一种解决方案(无需修改 myprogram.sh
)可能是:
$ myprogram.sh | while true; do head -10 >> /var/log/httpd/error_log; done
解释:
myprogram.sh
写入标准输出- 我们通过管道
|
. 将此输出重定向到 while true
是一个永远不会结束的无限循环,即使myprogram.sh
结束也应该打破管道。- 在每个循环中调用
head
命令将从管道读取的前 10 行附加到当前/var/log/httpd/error_log
文件的末尾(这可能与上一个循环不同,因为logrotate
).
while
bash 句子
(您可以更改每个循环中写入的行数)
另一种方式是:
$ myprogram.sh | while read line; do echo "$line" >> /var/log/httpd/error_log; done
- 这与第一个非常相似,但这会在
myprogram.sh
结束或关闭标准输出时结束循环。 - 它逐行工作,而不是成组地工作。