AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 502258
Accepted
Marry Jane
Marry Jane
Asked: 2019-02-23 01:16:16 +0800 CST2019-02-23 01:16:16 +0800 CST 2019-02-23 01:16:16 +0800 CST

bash como verificar o tamanho da troca

  • 772

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?

bash shell-script
  • 1 1 respostas
  • 1283 Views

1 respostas

  • Voted
  1. Best Answer
    fra-san
    2019-02-23T04:19:48+08:002019-02-23T04:19:48+08:00

    Supondo que seu kernel não seja realmente antigo e suporte a fallocatechamada de sistema (disponível desde a versão 2.6.23, veja man fallocate(1)e man fallocate(2)), fallocateprovavelmente 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 arquivo fstab.

    Supondo que você não tenha nenhuma troca ou tenha exatamente um arquivo de troca cujo caminho seja /swapfile:

    swapfile="/swapfile"
    
    # Make sure swap is on
    swapon --all
    
    # Check if our assumptions hold
    if    [ "$(swapon --show --noheadings | wc -l)" -gt 1 ]         ||
      (   [ "$(swapon --show --noheadings | wc -l)" -eq 1 ]         &&
        ( [ "$(swapon --show=TYPE --noheadings)" != 'file' ]        ||
          [ "$(swapon --show=NAME --noheadings)" != "$swapfile" ]
        )
      );  then
        echo "Unsafe to proceed, exiting."
        exit
    fi
    
    # Edit /etc/fstab if our file is not already there
    if ! grep -q '^[[:blank:]]*'"$swapfile"'[[:blank:]]\{1,\}none[[:blank:]]\{1,\}swap[[:blank:]]\{1,\}' /etc/fstab;
    then
        printf '%s\n' "$swapfile none swap sw 0 0" >> /etc/fstab
    fi
    
    # Create/replace the swap file
    swapoff --all
    [ -f "$swapfile" ] && rm -- "$swapfile"
    fallocate -l 2GiB -- "$swapfile"
    chmod 600 "$swapfile"
    mkswap -- "$swapfile"
    swapon --all
    

    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:

    # Check if we want to shrink the swap file i.e. it is bigger than 2 GiB
    # (or if we have no swap file)
    if  [ "$(free | awk '/^Swap:/ { print $2 }')" = "0" ] ||
        [ "$(free --bytes | awk '/^Swap:/ { print $2 }')" -gt 2147483648 ]; then
    
        # Create/replace the swap file
        # Same as above...
    
    fi
    

    Finalmente, supondo que sua versão do kernel seja pelo menos 3.14 e forneça MemAvailable( /proc/meminfocujo valor é relatado como a availablecoluna por free, consulte man 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:

    # Do we have no swap or more swap than 2GB?
    # If yes, do we have more available memory than used swap?
    if  ( [ "$(free | awk '/^Swap:/ { print $2 }')" = "0" ] ||
          [ "$(free --bytes | awk '/^Swap:/ { print $2 }')" -gt 2147483648 ]
        ) &&
        [ "$(awk '/MemAvailable:/ { print $2 }' /proc/meminfo)" -gt "$(free | awk '/Swap:/ { print $3 }')" ];
    then
        # Create/replace the swap file
        # Same as above...
    fi
    
    • 1

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • MySQL Select com função IN () com array bash

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve