我对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]