Bash脚本忽略if,然后声明;每次都会返回相同的结果

时间:2016-04-26 20:47:55

标签: linux bash shell scripting

我写了一个简短的脚本来比较free -m命令报告的可用内存量和交换量,如果有足够的空间用于交换+ 128M(以补偿瞬时增加在发出命令的确切时间交换使用),将交换的数据移回RAM。问题在于,无论我使用多少RAM,脚本都会返回"内存空间不足以解开"。我将echo命令放入并且数学运算正常,因此我将它简化为与if ((diff > 128)); 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

1 个答案:

答案 0 :(得分:1)

正如@thatotherguy指出的那样,由于到while循环的管道,avail和swap变量没有设置在同一范围内。像这样更改循环:

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