我正在编写一个shell脚本,根据大小利用logrotate.conf
实用程序来旋转日志文件。
#!/bin/bash
FILENAME=/xyz/console.log
while :
do
FILESIZE=$(du -h "$FILENAME")
####FILESIZE=$(stat -c%s "$FILENAME")
if [[ $FILESIZE > 10K ]];
then
echo "$FILENAME is too large = $FILESIZE"
echo "$(date ) is here"
cd "/etc"
$sudo logrotate -f logrotate.conf
echo "$ Newer version of log file is created"
else
echo "Log limit is not reached"
fi
sleep 60s
done
exit 0
即使尺寸小于10K,也不会打印else
块。在所有情况下,它正在执行if
块并在4.0K时旋转日志。只有当日志文件是零字节时才打印else
部分,即:
未达到日志限制
问题是[[ > ]]
正在进行字符串比较(基本上是字母顺序)而不是数字比较。因此,例如,[[ 9 > 10 ]]
为真,因为字符“9”在ASCII排序顺序中位于“1”之后。但是切换到数字比较(使用(( > ))
或[[ -gt ]]
)也不会起作用,因为你要比较的“数字”有单位后缀(字节“B”,千字节“K”等,所以500B小于1K并且du
的输出还包括文件名,在比较之前需要对其进行条带化。
这是太多的工作。只需使用stat
获得纯数字结果,并对其进行数值比较。哦,你应该坚持使用低级或混合大小写的变量名,以避免意外使用对shell有特殊意义的那些(例如PATH
):
...
filesize=$(stat -f %z "$filename")
if (( filesize > 10240 )); then
...
您正在使用字符串比较。例如,如果文件大小为2K,则qazxsw poi为true,因为2在10之后按字母顺序排列。
最简单的解决方案是放弃2K > 10K
选项 - 如果你想进一步处理结果,那么这没有多大意义 - 然后使用数值比较,
-h