2016-04-26 95 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

這工作完美。 –