Автоматически уничтожьте процесс, если он превышает данную сумму RAM

Я работаю над крупномасштабными наборами данных. При тестировании нового программного обеспечения сценарий будет иногда красться на мне, быстро захватывать всю доступную RAM и представлять мой неприменимый рабочий стол. Я хотел бы способ установить предел RAM для процесса так, чтобы, если он превышает ту сумму, он был уничтожен автоматически. Определенное для языка решение, вероятно, не будет работать, поскольку я использую все виды различных инструментов (R, Perl, Python, Bash, и т.д.).

Так есть ли своего рода монитор процесса, который позволит мне установить пороговую сумму RAM и автоматически уничтожить процесс, если это будет использовать больше?

12
задан 27 July 2011 в 10:04

4 ответа

Я очень не хочу быть парнем, который отвечает на его собственный вопрос, но этим утром я нашел альтернативный метод, перенесенный в миленькую утилиту. Это ограничит процессорное время или потребление памяти:

https://github.com/pshved/timeout

Я даю этому выстрел сначала, но upvotes к Amey Jah для хорошего ответа. Я проверю его, если этот приведет меня к сбою.

11
ответ дан 23 November 2019 в 03:34

Я настоятельно советовал бы, чтобы не сделать это. Как предложено @chrisamiller, устанавливая ulimit ограничит RAM, доступную с процессом.

Но все еще если Вы настаиваете, затем выполняют эту процедуру.

  1. Сохраните следующий сценарий как killif.sh:

    #!/bin/sh
    
    if [ $# -ne 2 ];
    then
        echo "Invalid number of arguments"
        exit 0
    fi
    
    while true;
    do
        SIZE=$(pmap $1|grep total|grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id =$1 Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$1"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    
        sleep 10
    done
    
  2. Теперь сделайте это исполняемым файлом.

    chmod +x killif.sh
    
  3. Теперь запустите этот скрипт на терминале. Замена PROCID с фактическим идентификатором процесса и SIZE с размером в МБ.

    ./killif.sh PROCID SIZE
    

    Например:

    ./killif.sh 132451 100
    

    Если SIZE 100 затем, процесс будет уничтожен, если его Использование оперативной памяти повысится вне 100 МБ.

Внимание: Вы знаете то, что является Вами пытающийся сделать. Уничтожение процесса не является хорошей идеей. Если тот процесс имеет какое-либо завершение работы, или команда остановки затем редактируют сценарий и замену kill -9 команда с этим shutdown команда.

9
ответ дан 23 November 2019 в 03:34

Попробуйте prlimit инструмент, от util-linux пакет. Это запускает программу с пределами ресурса. Это использует prlimit системный вызов для установки пределов, которые затем осуществляются просто ядром.

Можно настроить 16 пределов, включая:

  • максимальная сумма процессорного времени в секундах
  • максимальное количество пользовательских процессов
  • максимальный размер резидентного набора ("используемая память")
  • максимальный размер процесс может заблокировать в память
  • размер виртуальной памяти
  • максимальное количество открытых файлов
  • максимальное количество блокировок файла
  • максимальное количество незаконченных сигналов
  • максимальные байты в очередях сообщений POSIX
2
ответ дан 23 November 2019 в 03:34

Это было слишком большим для установки комментарию. Я изменил исходный сценарий Amey для включения a pgrep, таким образом вместо того, чтобы иметь необходимость вручную ввести идентификатор процесса, можно просто исключить по имени. Например, ./killIf.sh chrome 4000 уничтожает любой хромовый процесс, который превышает 4 ГБ в использовании памяти.

#!/bin/sh

# $1 is process name
# $2 is memory limit in MB

if [ $# -ne 2 ];
then
    echo "Invalid number of arguments"
    exit 0
fi

while true;
do
    pgrep "$1" | while read -r procId;
    do
        SIZE=$(pmap $procId | grep total | grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id = $procId Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$procId"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    done

    sleep 1
done

Старайтесь выбрать узкую строку grep, и достаточно большая память ограничивают весьма, обязательно уничтожают непреднамеренные процессы.

0
ответ дан 23 November 2019 в 03:34

Другие вопросы по тегам:

Похожие вопросы: