gpt4 book ai didi

bash - 使用 Bash 脚本轮换日志

转载 作者:行者123 更新时间:2023-11-29 08:46:19 25 4
gpt4 key购买 nike

我有以下问题:

我有一个应用程序,它不断地向 stderr 和 stdout 生成输出。此应用程序的输出被捕获在日志文件中(该应用程序被重定向为:&> log.txt)。我没有任何选项可以为此生成适当的日志文件。

现在,我有一个 cron 作业,它每小时运行一次,除了做其他事情之外,它还尝试旋转上面的日志文件,将其复制到 log.txt.1,然后创建一个空文件并将其复制到日志.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 的想法

  1. 制作命名管道:

    mkfifo /dev/mypipe
  2. 将 stdout 和 stderr 重定向到命名管道:

    &> /dev/mypipe
  3. 从 mypipe 读入文件:

    cat < /dev/mypipe > /var/log/log.txt &
  4. 当需要log-rotate时,kill cat,rotate log,重启cat。

现在,我还没有测试过这个。告诉我们进展如何。

注意:您可以为命名管道指定任何名称,例如/var/tmp/pipe1 、/var/log/pipe 、/tmp/abracadabra 等。只需确保在启动后您的日志脚本运行后重新创建管道即可。


或者,不使用 cat,而是使用一个简单的脚本文件:

#!/bin/bash

while : ; do
read line
printf "%s\n" "$line"
done

此脚本保证每次读取换行符都有一个输出。 (cat 可能直到其缓冲区已满或遇到 EOF 才开始输出)


最终——和测试——尝试

重要提示:请阅读下面来自 @andrew 的评论。您需要注意几种情况。

好的!终于可以访问我的 Linux 机器了。方法如下:

第 1 步:制作此记录器脚本:

#!/bin/bash

LOGFILE="/path/to/log/file"
SEMAPHORE="/path/to/log/file.semaphore"

while : ; do
read line
while [[ -f $SEMAPHORE ]]; do
sleep 1s
done
printf "%s\n" "$line" >> $LOGFILE
done

第 2 步:将记录器投入工作:

  1. 制作命名管道:

    mkfifo $PIPENAME
  2. 将应用程序的 STDOUT 和 STDERR 重定向到命名管道:

    ...things... &> $PIPENAME
  3. 启动记录器:

    /path/to/recorder.sh < $PIPENAME &

    您可能想要 nohup上面的内容使其在注销后仍然存在。

  4. 完成!

第 3 步:如果您需要 logrotate,请暂停记录器:

touch /path/to/log/file.semaphore
mv /path/to/log/file /path/to/archive/of/log/file
rm /path/to/log/file.semaphore

我建议将以上步骤放到自己的脚本中。请随意将第 2 行更改为您要使用的任何日志轮换方法。


注意:如果您对 C 编程很得心应手,您可能想编写一个简短的 C 程序来执行 recorder.sh 的功能。 .编译的 C 程序肯定比 nohup-ed 分离的 bash 脚本更轻。


注意 2:David Newcomb 在评论中提供了一个有用的警告:当记录器未运行时,写入管道将阻塞并且 可能 导致程序意外失败。确保记录器关闭(或旋转)的时间尽可能短。

所以,如果你能确保旋转发生真的很快,你可以替换sleep (一个只接受整数值的内置命令)与 /bin/sleep (接受浮点值的程序)并将 sleep 时间设置为 0.5或更短。

关于bash - 使用 Bash 脚本轮换日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5789526/

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