我有一个 bash 脚本,它检查交换是否存在,如果不存在,则创建一个;
if free | awk '/^Swap:/ {exit !$2}'; then
echo "Have swap, skipping"
sudo swapoff -a
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo mkswap /swapfile
sudo swapon /swapfile
else
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
sudo echo -e "/swapfile none swap sw 0 0 \n" >> /etc/fstab
fi
现在我还想添加一个检查以找出交换大小 - 如果它已经存在 - 因为如果交换已经存在并且它是 4GB,那么我会将它降级到 2GB 而不是跳过。
我怎样才能做到这一点?
编辑:该脚本当前创建一个 2GB 的交换文件,无论它是否存在,所以如果我有 4GB 的交换文件,它会将其更改为 2GB,但如果我也有 2GB 的交换文件,它仍然会用 2GB 重新进行交换。我认为这不是一个好的选择,所以我想知道是否应该添加交换大小检查?
假设您的内核不是很旧并且支持
fallocate
系统调用(从版本 2.6.23 开始可用,请参阅man fallocate(1)
和man fallocate(2)
),fallocate
可能会很快,因为它不写入数据块。因此,总是创建一个新的交换文件没有什么大问题。您可能希望有条件地执行的唯一步骤是编辑您的fstab
.假设您根本没有交换或只有一个交换文件,其路径为
/swapfile
:您可能仍希望避免不必要地关闭和打开您的交换:如果使用了很大一部分,这可能是一个缓慢的操作,如果没有足够的可用内存,它可能会产生不良后果。
为了部分解决这些问题(并回答您的原始问题),上述代码的最后一部分可以包含在条件块中:
最后,假设您的内核版本至少为 3.14 并提供
MemAvailable
in/proc/meminfo
(其值由 报告为available
列free
,请参阅man free(1)
),您还可以在尝试关闭交换之前检查是否有足够的可用内存。最后的代码片段变为: