好的,从我的角度来看,这是一个非常实用的用例。
假设我有一个简单的 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 为单位)。