Я работаю над крупномасштабными наборами данных. При тестировании нового программного обеспечения сценарий будет иногда красться на мне, быстро захватывать всю доступную RAM и представлять мой неприменимый рабочий стол. Я хотел бы способ установить предел RAM для процесса так, чтобы, если он превышает ту сумму, он был уничтожен автоматически. Определенное для языка решение, вероятно, не будет работать, поскольку я использую все виды различных инструментов (R, Perl, Python, Bash, и т.д.).
Так есть ли своего рода монитор процесса, который позволит мне установить пороговую сумму RAM и автоматически уничтожить процесс, если это будет использовать больше?
Я очень не хочу быть парнем, который отвечает на его собственный вопрос, но этим утром я нашел альтернативный метод, перенесенный в миленькую утилиту. Это ограничит процессорное время или потребление памяти:
https://github.com/pshved/timeout
Я даю этому выстрел сначала, но upvotes к Amey Jah для хорошего ответа. Я проверю его, если этот приведет меня к сбою.
Я настоятельно советовал бы, чтобы не сделать это. Как предложено @chrisamiller, устанавливая ulimit ограничит RAM, доступную с процессом.
Но все еще если Вы настаиваете, затем выполняют эту процедуру.
Сохраните следующий сценарий как 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
Теперь сделайте это исполняемым файлом.
chmod +x killif.sh
Теперь запустите этот скрипт на терминале. Замена PROCID
с фактическим идентификатором процесса и SIZE
с размером в МБ.
./killif.sh PROCID SIZE
Например:
./killif.sh 132451 100
Если SIZE
100 затем, процесс будет уничтожен, если его Использование оперативной памяти повысится вне 100 МБ.
Внимание: Вы знаете то, что является Вами пытающийся сделать. Уничтожение процесса не является хорошей идеей. Если тот процесс имеет какое-либо завершение работы, или команда остановки затем редактируют сценарий и замену kill -9
команда с этим shutdown
команда.
Попробуйте prlimit
инструмент, от util-linux
пакет. Это запускает программу с пределами ресурса. Это использует prlimit
системный вызов для установки пределов, которые затем осуществляются просто ядром.
Можно настроить 16 пределов, включая:
Это было слишком большим для установки комментарию. Я изменил исходный сценарий 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, и достаточно большая память ограничивают весьма, обязательно уничтожают непреднамеренные процессы.