我写了一个简短的脚本来比较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
答案 0 :(得分:1)
正如@thatotherguy指出的那样,由于到while循环的管道,avail和swap变量没有设置在同一范围内。像这样更改循环:
while read -a bytes
do
swap=${bytes[2]}
done < swapline