2016-04-26 4 views
0

Я написал короткий скрипт для сравнения количества доступной ОЗУ, сообщенного командой 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 
+0

Вы пытались 'echo $ diff', перед' if ((diff> 128)); затем'. Что это говорит – MSameer

+0

проверить для пробелов ... bash этого не терпит. – zee

+0

@MSameer просто попробовал это, и он дал мне '0 Недостаточно места в памяти для разблокировки. Таким образом, проблема заключается в вычитании. Может быть, синтаксическая ошибка? –

ответ

1

В @thatotherguy отмечалось, Свободна и своп переменные не установлены в той же области, из-за трубы к петлям в то время. Измените петли следующим образом:

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

Это будет перезаписывать 'swap' каждую итерацию, так что все еще не совсем правильно. –

+0

Если это не намерение, тогда мне это не ясно из кода. – Chaos

+0

Это прекрасно работает. –

Смежные вопросы