Eu tenho um script bash que verifica se um swap existe ou não e se não existe, ele cria um;
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
Agora também quero adicionar uma verificação para descobrir o tamanho da troca - se já existir - porque se a troca já existir e for de 4 GB, farei o downgrade para 2 GB em vez de pular.
Como posso fazer isso?
Editar: O script atualmente cria um arquivo de troca de 2 GB, independentemente de existir ou não, portanto, se eu tiver um arquivo de troca de 4 GB, ele o alterará para 2 GB, mas se eu também tiver um arquivo de troca de 2 GB, ele ainda fará a troca com 2 GB. Eu pensei que essa não é uma boa opção, então é por isso que eu me pergunto se devo adicionar uma verificação de tamanho de troca ou não?
Supondo que seu kernel não seja realmente antigo e suporte a
fallocate
chamada de sistema (disponível desde a versão 2.6.23, vejaman fallocate(1)
eman fallocate(2)
),fallocate
provavelmente será rápido, pois não grava blocos de dados. Portanto, não há grande problema em sempre criar um novo arquivo de troca. A única etapa que você provavelmente desejará executar condicionalmente é editar seu arquivofstab
.Supondo que você não tenha nenhuma troca ou tenha exatamente um arquivo de troca cujo caminho seja
/swapfile
:Você ainda pode evitar desligar e ligar desnecessariamente sua troca: pode ser uma operação lenta se uma fração substancial dela for usada e pode ter consequências indesejadas se não houver memória suficiente disponível.
Para resolver parcialmente essas preocupações (e também responder à sua pergunta original), a última parte do código acima pode ser incluída em um bloco condicional:
Finalmente, supondo que sua versão do kernel seja pelo menos 3.14 e forneça
MemAvailable
(/proc/meminfo
cujo valor é relatado como aavailable
coluna porfree
, consulteman free(1)
), você também pode verificar se tem memória disponível suficiente antes de tentar desativar a troca.O último trecho de código se torna: