微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux Bash shell脚本中的IO重定向无法重新创建已移动/已删除的文件?

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

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

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

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

例如mv err.log err [date-time] .log

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

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

解决方法:

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

用法示例:

myprog | rotatelogs logname.log 50M

这样,只要大小达到50兆字节,就会轮换日志.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐