Я написал короткий скрипт для сравнения количества доступной ОЗУ, сообщенного командой free -m
, с количеством используемого swap и, если имеется достаточно места для обмена + 128M (для компенсации кратковременного увеличения при использовании подкачки в то время, когда выдается команда), переместите данные обмениваемых данных в ОЗУ. Проблема в том, что независимо от того, сколько оперативной памяти я использую, сценарий возвращает «Недостаточно места в памяти для разблокировки». Я положил echo
команд, и математика работает, поэтому я утончаю это как-то связано с линией if ((diff > 128)); then
. Я был бы признателен, если бы кто-нибудь мог взглянуть.Сценарий Bash игнорирует if, then statement; возвращает один и тот же результат каждый раз
Примечание. Я хочу использовать сценарий с заданием cron на сервере виртуализации, чтобы возвращать машины KVM, которые были заменены на память, если есть место. Поскольку на моем сервере также я тестирую новые дистрибутивы, мое использование ОЗУ имеет периодические всплески. Следовательно, редко используемые виртуальные машины, такие как 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
Вы пытались 'echo $ diff', перед' if ((diff> 128)); затем'. Что это говорит – MSameer
проверить для пробелов ... bash этого не терпит. – zee
@MSameer просто попробовал это, и он дал мне '0 Недостаточно места в памяти для разблокировки. Таким образом, проблема заключается в вычитании. Может быть, синтаксическая ошибка? –