gpt4 book ai didi

linux - Linux Bash shell 脚本中的 IO 重定向不重新创建移动/删除的文件?

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

我对 Linux 上的 shell 编程很陌生,在我的 Linux 实例中,我按照以下方式将程序的 stdout 和 stderr 重定向到两个文件并在后台运行它

myprog > run.log 2>> err.log &

这很好用,我得到了我想要的行为

现在有另一个后台进程监视 run.log 和 err.log,如果日志文件增长超过特定阈值,则将它们移动到其他文件名。

例如mv err.log err[日期时间].log

我的期望是,在这个文件移动发生后,err.log 将被 myprog 输出重定向再次创建,新的输出将被写入该新文件。但是,在我的日志文件监视进程移动文件后,err.log 或 run.log 再也不会创建,尽管 myprog 继续运行没有任何问题。

这是 Linux 中的正常行为吗?如果是,我应该怎么做才能让我的预期行为发挥作用?

最佳答案

是的,是的。除非您先重新打开文件,否则它将继续写入旧文件,即使您无法再访问它。事实上,被删除文件使用的空间只有在每个进程关闭它之后才可用。如果重新打开它是不可能的(即你不能更改可执行文件也不能重新启动它),那么像 http://httpd.apache.org/docs/2.4/programs/rotatelogs.html 这样的解决方案是你最好的选择。它可以根据文件大小或时间轮换日志,甚至可以在轮换后调用自定义脚本。

示例用法:

myprog | rotatelogs logname.log 50M

这样,每当大小达到 50 兆字节时,日志就会轮换。

[编辑:指向更新版本的 rotatelogs]

关于linux - Linux Bash shell 脚本中的 IO 重定向不重新创建移动/删除的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942363/

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