dav*_*vid 29 size io-redirection limit
如何将写入的日志文件的大小限制>>
为 200MB?
$ run_program >> myprogram.log
Run Code Online (Sandbox Code Playgroud)
Cal*_*leb 12
如果您的程序不需要写入任何大于此限制的其他文件,您可以使用ulimit
. 在运行命令之前,运行此命令为当前 shell 会话中运行的所有进程设置 200MB 的文件大小限制:
ulimit -f $((200*1024))
Run Code Online (Sandbox Code Playgroud)
这将保护您的系统,但它可能会对写入文件的程序造成冲击。正如eyazici 建议的那样,考虑设置在logrotate
达到特定大小或年龄后修剪日志文件。您可以丢弃旧数据或将其存档在一系列压缩文件中一段时间。
Emr*_*ici 12
如果您的应用程序(即run_program
)不支持限制日志文件的大小,那么您可以使用外部应用程序或脚本循环定期检查文件大小。
您还可以使用logrotate(8)
轮换日志,它具有size
可用于您的目的的参数:
这样,当达到指定的大小时,日志文件会旋转。可以以字节(默认)、千字节 (sizek) 或兆字节 (sizem) 为单位指定大小。
您可以使用以下命令截断输出head
:
size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
Run Code Online (Sandbox Code Playgroud)
您可以创建一个新的文件系统映像,使用循环设备挂载它并将日志文件放在该文件系统上:
dd if=/dev/zero of=./200mb.img bs=1024 count=200000 # create new empty 200MB file
mkfs.ext2 200mb.img # or ext3, or whatever fits your needs
mkdir logs
sudo mount -t ext2 -o loop 200mb.img logs # only root can do '-o loop' by default
run_program >>logs/myprogram.log
Run Code Online (Sandbox Code Playgroud)
tmpfs
如果您有足够的内存,您也可以使用代替文件。
小智 6
我确信原始海报已经找到了解决方案。这是其他可能阅读此主题的人的另一篇文章......
Curtail 限制程序输出的大小并使用以下命令保留最后 200MB 的输出:
$ run_program | curtail -s 200M myprogram.log
Run Code Online (Sandbox Code Playgroud)
注意:我是上述存储库的维护者。只是分享解决方案...
在包apache2-utils
中存在名为 的实用程序rotatelogs
,它可能对您有所帮助。
概要:
rotatelogs [ -l ] [ -L linkname ] [ -p program ] [ -f ] [ -t ] [ -v ] [ -e ] [ -c ] [ -n number-of-files ] logfile rotationtime|filesize(B|K|M|G) [ offset ]
Example:
your_program | rotatelogs -n 5 /var/log/logfile 1M
Run Code Online (Sandbox Code Playgroud)
Full manual you may read on this link.