Elimina automaticamente um processo se exceder uma determinada quantidade de RAM

10

Eu trabalho em conjuntos de dados de grande escala. Ao testar um novo software, um script às vezes me surpreende, pega rapidamente toda a RAM disponível e inutiliza minha área de trabalho. Eu gostaria de uma maneira de definir um limite de RAM para um processo, de modo que, se exceder esse valor, ele será eliminado automaticamente. Uma solução específica de idioma provavelmente não funcionará, pois eu uso todos os tipos de ferramentas diferentes (R, Perl, Python, Bash, etc).

Então, há algum tipo de monitor de processo que me permitirá definir uma quantidade limite de RAM e automaticamente matar um processo se ele usar mais?

    
por chrisamiller 27.07.2011 / 19:04

3 respostas

7

Eu odeio ser o cara que responde a sua própria pergunta, mas esta manhã eu encontrei um método alternativo, envolvido em uma pequena utilidade. Isso limitará o tempo de CPU ou o consumo de memória:

link

Estou dando uma chance a este primeiro, mas recomendo a Amey Jah pela boa resposta. Vou checar se esse aqui me falha.

    
por chrisamiller 28.07.2011 / 20:46
7

Recomendo veementemente que não faça isso . Como sugerido por @chrisamiller, configurar o ulimit limitará a RAM disponível com o processo.

Mas ainda se você estiver insistindo, siga este procedimento.

  1. Salve o seguinte script como killif.sh :

    #!/bin/sh
    
    if [ $# -ne 2 ];
    then
        echo "Invalid number of arguments"
        exit 0
    fi
    
    while true;
    do
        SIZE=$(pmap |grep total|grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id = Size = $SIZEMB MB"
        if [ $SIZEMB -gt  ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 ""
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    
        sleep 10
    done
    
  2. Agora torne-o executável.

    chmod +x killif.sh
    
  3. Agora, execute este script no terminal. Substitua PROCID pelo ID do processo real e SIZE pelo tamanho em MB.

    ./killif.sh PROCID SIZE
    

    Por exemplo:

    ./killif.sh 132451 100
    

    Se SIZE for 100, o processo será eliminado se seu uso de RAM ultrapassar 100 MB.

Cuidado: Você sabe o que está tentando fazer. Processo de matança não é uma boa ideia. Se esse processo tiver qualquer comando de encerramento ou parada, edite o script e substitua o comando kill -9 pelo comando shutdown .

    
por Amey Jah 27.07.2011 / 20:31
2

Experimente a ferramenta prlimit , do pacote util-linux . Ele executa um programa com limites de recursos. Ele usa a chamada do sistema prlimit para configurar os limites, que são então aplicados apenas pelo kernel.

Você pode configurar 16 limites, incluindo:

  • quantidade máxima de tempo de CPU em segundos
  • número máximo de processos do usuário
  • tamanho máximo de conjunto de residentes ("memória usada")
  • tamanho máximo que um processo pode bloquear na memória
  • tamanho da memória virtual
  • número máximo de arquivos abertos
  • número máximo de bloqueios de arquivos
  • número máximo de sinais pendentes
  • bytes máximos nas filas de mensagens POSIX
por bgeron 17.09.2017 / 18:22