我有以下问题:
我有一个应用程序,它不断地向 stderr 和 stdout 生成输出。该应用程序的输出被捕获在日志文件中(该应用程序被重定向为:&> log.txt
)。我没有任何选项来为此生成适当的日志记录。
现在,我有一个 cron 作业,它每小时运行一次,除了做其他事情之外,它还尝试通过将其复制到 log.txt.1 来轮换上面的日志文件,然后创建一个空文件并将其复制到 log.txt
看起来像:
cp log.txt log.txt.1
touch /tmp/empty
cp /tmp/empty log.txt
问题是,应用程序仍在写入它,因此我在 log.txt.1 中得到一些非常奇怪的东西,它以很多垃圾字符开头,而实际的日志文件位于末尾的某个地方。
您是否知道如何针对这种特定情况进行正确的日志旋转(我也尝试过cat log.txt > log.txt.1
,不起作用)?使用logrotate
对于这个特定的应用程序来说不是一个选项,幕后有一个我可能不会改变的完整机制。
谢谢,
F。
好的,这是一个想法,灵感来自http://en.wikibooks.org/wiki/Bourne_Shell_Scripting/Files_and_streams http://en.wikibooks.org/wiki/Bourne_Shell_Scripting/Files_and_streams
-
制作一个命名管道:
mkfifo /dev/mypipe
-
将 stdout 和 stderr 重定向到命名管道:
&> /dev/mypipe
-
从 mypipe 读入文件:
cat < /dev/mypipe > /var/log/log.txt &
当您需要日志轮换时,杀死猫,轮换日志,然后重新启动猫。
现在,我还没有测试过这个。告诉我们进展如何。
注意:您可以为命名管道指定任何名称,例如 /var/tmp/pipe1 、 /var/log/pipe 、 /tmp/abracadabra 等。只需确保在启动后重新创建管道before您的日志记录脚本运行。
或者,不要使用 cat,而使用一个简单的脚本文件:
#!/bin/bash
while : ; do
read line
printf "%s\n" "$line"
done
该脚本保证每个换行符读取都有一个输出。 (cat 可能不会开始输出,直到其缓冲区已满或遇到 EOF)
最终的——并且经过测试的——尝试
重要的提示:请阅读以下评论@andrew以下。有几种情况您需要注意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)