在/home
目录下具有各种客户帐户的服务器上运行cPanel。
许多客户的error_log
文件超出了期望的大小(例如100MB),我想创建一个cron作业来每天运行以截断一定大小的任何文件。
我知道truncate可以缩小文件,但是如果文件小于规定的数量,它将扩展文件,所以下面的解决方案(首先找到大于所需大小的所有文件,然后缩小它们)最有意义,并且会能行吗?
for i in $(find /home -type f -iname error_log -size +99M); do
truncate -s 100M $i
done
答案 0 :(得分:4)
我建议rotating and compressing logs,而不是将其截断。日志通常可以很好地压缩,并且您可以根据需要将压缩后的日志移至备份介质。另外,如果您必须删除任何内容,请删除最旧的日志,而不是最新的日志。
也就是说,出于教育目的,让我们探索truncate
。尽管它被埋藏在文档中,但它只能收缩文件:
SIZE可能还带有以下修饰字符之一:'+'扩展,'-'缩减,'<<至多,'>'至少,'/'向下舍入为' %'四舍五入为整数。
如果文件的深度固定,则不需要循环也不需要find
调用。一个简单的glob可以做到:
truncate -s '<100M' /home/*/path/to/error_log
如果它们的深度不可预测,则可以使用扩展的globbing ...
shopt -s extglob
truncate -s '<100M' /home/**/error_log
...或者使用find -exec <cmd> {} +
,它告诉find
在找到的文件上调用命令。
find /home -name error_log -exec truncate -s '<100M' {} +
(如果有很多文件find
是最安全的。glob选项可能会超过Linux的命令行长度限制,而find
会避免这种可能性。)
答案 1 :(得分:1)
for i in $(...)
。它将在空白处中断。 "$i"
。find
有-exec
,只需使用它即可。所以:
find /home -type f -iname error_log -size +99M -exec truncate -s 100M {} \;