linux - Bash 脚本忽略 if, then 语句;每次返回相同的结果

标签 linux bash shell scripting

<分区>

我写了一个简短的脚本来比较 free -m 命令报告的可用 RAM 量与使用的交换空间量,如果有足够的空间用于交换空间 + 128M(到补偿在发出命令的确切时间交换使用的瞬时增加),将交换的数据移回 RAM。问题是无论我使用多少 RAM,脚本都会返回“内存中没有足够的空间来取消交换”。我输入了 echo 命令并且数学运算有效,所以我认为这与 if ((diff > 128)); 有关然后行。如果有人可以看一下,我将不胜感激。

注意:我想在虚拟化服务器上​​使用带有 cron 作业的脚本来返回已换出到内存(如果有空间)的 KVM 机器。由于我的服务器也是我试用新发行版的地方,因此我的 RAM 使用率往往会出现周期性的峰值。因此,像 ownCloud 这样很少使用的 VM 偶尔会被换出,但在我或其他人需要它们做某事之前不会重新使用,然后我就会收到提示它们坏了或速度慢得令人痛苦的消息。

#!/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

最佳答案

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

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

关于linux - Bash 脚本忽略 if, then 语句;每次返回相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36875419/

相关文章:

linux - cron.daily 中的 Shell 脚本不起作用

linux - 在 Ubuntu 16.04 上启动 crond.service

c++ - ACE 如何启用 IPv6

shell - 如何在 ubuntu 中删除交换文件?

linux - Upstart 导致两个进程 - 为什么?

bash - 如何使用 cygwin bash 日期实用程序找到当月的第一个星期一?

shell - 是否可以通过 gnu awk 命令使用变量而不是文件?

linux - Grep 命令需要解释

linux - 在 openwrt 上启动 coova-chilli 时出错

bash - 为什么 ps 格式选项 '%a' 被截断了?