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


10

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

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

在此背后产生共鸣,是为了防止错误地填充安装点上的整个可用空间。如果我忘记了该脚本,或者它每小时会产生GB的数据,那么此简单的调试任务可能会导致潜在的系统崩溃。

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

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

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

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

脚本可能崩溃,被杀死或任何其他原因。

我正在寻找的解决方案应该简单易用,仅使用流行发行版中可用的工具,例如ubuntu / debian / fedora。一般而言,一些东西可以广泛使用。无论语言/技术如何,都不能选择复杂的多行程序。

Answers:


16

您可以head为此使用:

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

它接受K,M,G等作为后缀(默认为字节)。附加“ B”以使用基数为10的版本。


头壁墙再简单不过了。谢谢!
mdrozdziel 2011年

2
看起来tail -c 1G也很有效,可以查看事件的结尾。可以理解,命令结束后它会刷新。
2016年

后缀单位在Mac OS上不起作用。
anumi

0

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

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

如果您的日志用户名为log_maker,则将此行添加到文件中:

log_maker hard fsize 1000000

fsize之后的数字是最大文件大小,以KB为单位。



0

您可以限制任何文件

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

将尾部直接写入同一文件将生成一个空文件。因此,您需要使用一个临时文件。


tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log这将杀死日志,我想您想使用>>而不是>还是不?
djdomi

该命令的目的是仅使用最后一个1G重写日志。>>应该用于前面的命令:doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
塞韦林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.