2016-04-26 44 views
0

我编写了一个简短脚本,用于比较free -m命令报告的可用RAM量与所用交换量,并且如果有足够的空间交换+ 128M(以补偿瞬时增加在发出命令的准确时间交换使用),将交换的数据移回RAM中。问题是无论我使用多少RAM,该脚本都会返回“没有足够的内存空间来解锁”。我把echo命令和数学作品放在一起,所以我认为它与if ((diff > 128)); then系列有关。如果有人能够看一看,我会很感激。Bash脚本忽略if,then语句;每次都返回相同的结果

注意:我想在虚拟化服务器上​​使用带有cron作业的脚本,以便在有空间的情况下返回已交换到内存的KVM机器。由于我的服务器也是我尝试使用新发行版的地方,因此我的RAM使用情况往往会出现周期性峰值。因此,很少使用像ownCloud这样的虚拟机偶尔会被换掉,但在我或其他人需要某些东西之前不会再回来,然后我收到投诉他们已经损坏或非常缓慢。

#!/bin/bash 
# This script moves data from swap back into RAM 

meminfo=$(mktemp -d -t meminfo.XXXXXX) 
cd $meminfo 
info=$(mktemp info.XXXXXX) 
swapline=$(mktemp swapline.XXXXXX) 
freeline=$(mktemp freeline.XXXXXX) 
free -m > info 
exec 0< info 

sed -n '2p' info > freeline 
less freeline | while read -a values; 
do 
    free=${values[3]} 
    cached=${values[6]} 
    avail=$[$free+$cached] 
done 

sed -n '4p' info > swapline 
less swapline | while read -a bytes; 
do 
    swap=${bytes[2]}; 
done 

diff=$((avail - swap)) 

if ((diff > 128)); then 
    echo "unswapping" 
    swapoff -a 
    swapon /dev/sda2 
else 
    echo "Not enough room in memory to unswap" 
fi 

rm -r $meminfo 
# 

这里是free -m的当前输出;该脚本仍然不起作用。

   total  used  free  shared buffers  cached 
Mem:   3019  2930   88   12   49  851 
-/+ buffers/cache:  2029  989 
Swap:   1928  165  1763 
+0

是否尝试'echo $ diff',在if((diff> 128))之前; then'。这是什么说 – MSameer

+0

检查尾随空格... bash不容忍这一点。 – zee

+0

@MSameer刚刚尝试过,它给了我'0没有足够的空间在内存中去掉“。所以问题在于减法。也许是语法错误? –

回答

1

正如@thatotherguy指出的,果和交换变量没有在同一范围内设置,由于管的while循环。改变循环,如下所示:

while read -a bytes 
do 
    swap=${bytes[2]} 
done < swapline 
+0

每次迭代都会覆盖'swap',所以它仍然不太正确。 –

+0

如果这不是我的意图,那么从代码中就不清楚了。 – Chaos

+0

这工作完美。 –