在 shell 脚本级别限制文件大小 (stdout) 的简单方法?

在 shell 脚本级别限制文件大小 (stdout) 的简单方法?

好的,从我的角度来看,这是一个非常实用的用例。

假设我有一个简单的 shell oneliner,它会将输出记录到文件中。这可以是任何东西,例如 tcpdump。是否有任何通用且简单的方法可以确保输出文件不会超出给定的大小?

这样做的原因是为了防止错误地填满挂载点上的整个可用空间。如果我忘记了脚本,或者它每小时会产生 GB 的数据,那么这个简单的调试任务可能会导致系统崩溃。

现在,我知道一些工具中内置的选项(例如 tcpdump 中的 -W/-C 组合)。我需要的是一个非常通用的故障保护。

长话短说 - 当我运行如下脚本时:

% this -is --my=very|awsome|script >> /var/tmp/output.log

如何确保output.log永远不会超过1GB。

脚本可能会崩溃、被终止或者发生其他情况。

我寻找的解决方案应该简单易用,仅使用 ubuntu/debian/fedora 等流行发行版中提供的工具。一般来说,这是广泛可用的东西。无论使用哪种语言/技术,复杂的多行程序都不是这里的选择。

答案1

你可以使用head以下方法:

command | head -c 1G > /var/tmp/output.log

它接受 K、M、G 等作为后缀(默认为字节)。附加“B”以使用十进制版本。

答案2

curtail 限制程序输出的大小,并使用以下命令保留最后的 X KB 输出:

run_program | curtail -s 1G myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

注意:我是上述 repo 的维护者。只是分享解决方案...

答案3

为仅用于运行这些脚本的用户设置最大文件大小。

该文件/etc/security/limits使用“默认”值限制用户,除非有针对特定用户的明确值。这些用户特定值将覆盖默认值。该文件的名称可能略有不同,具体取决于您的操作系统。

如果您的日志用户名是 log_maker,则将以下行添加到文件:

log_maker hard fsize 1000000

fsize 后面的数字是最大文件大小(以 KB 为单位)。

答案4

就像 Seamus 在 Eduardo Ivanec 的回答中所说的那样,这个问题似乎是在问如何持续更新文件,就像从外部进行备份一样

  1. 写一个脚本,限制文件大小注意:此方法是允许输出文件大于指定的睡眠间隔。

| #!/bin/sh

MY_FILE="myJournal.log"

while true; do
  echo "$(tail ${MY_FILE} -c 400)" > ${MY_FILE}
  sleep 1
done
  1. 跑过,并保持其运行:

    ./cutter.sh &

  2. 运行指向文件的脚本/应用程序,例如:

    journalctl -f >> myJournal.log

相关内容