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]

上一篇:python – “subprocess.Popen” – 检查成功和错误


下一篇:c++ 随机生成带权联通无向图