Limita uso de CPU

Solapas principales

Nombre:

nicpu
Autor: dasf
Origen: foros, dasf
Lenguaje: Bash
Licencia: GPL
Propósito: Limita el uso de CPU
Dependencias: cpulimit, gawk, renice, top

#!/bin/bash

# Variables
CPU_LIMIT=60       # Maximo porcentaje de consumo de CPU por cada PID
DAEMON_INTERVAL=3  # Frecuencia de verificacion (en segundos)
BLACK_PROCESSES_LIST=   # Limita solamente los procesos definidos en esta variable. Si la variable está vacia (Por defecto) limita todos los procesos que violen la resctriccion.
WHITE_PROCESSES_LIST=apt-get   # Limita todos los procesos excepto los procesos definidos en esta variable. Si la variable está vacia (Por defecto) limita todos los procesos que violen la resctriccion.

# Evalua si una de las variables BLACK_PROCESSES_LIST o WHITE_PROCESSES_LIST está definida.
if [[ -n "$BLACK_PROCESSES_LIST" &&  -n "$WHITE_PROCESSES_LIST" ]] ; then    # Si ambas variables estas definidas, entonces se produce un error.
   echo "Al menos una de las variables BLACK_PROCESSES_LIST o WHITE_PROCESSES_LIST debe ser vacia."
   exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then                                 # Si esta variable no está vacia entonces asigna la variable NEW_PIDS_COMMAND con el comando que aparece abajo
   NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then                                 # Si esta variable no está vacia entonces asigna la variable NEW_PIDS_COMMAND con el comando que aparece abajo
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi

# Busca y limita los PIDs de los procesos que violan la restriccion
while sleep $DAEMON_INTERVAL
do
   NEW_PIDS=$(eval "$NEW_PIDS_COMMAND")                                                                    # PIDs que violan la restriccion
   LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}')                                          # PIDs que ya han sido limitados
   QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')   # PIDs en cola

   for i in $QUEUE_PIDS
   do
       #Obtiene la prioridad del proceso a limitar
       PRIORITY=$(top -b -n1 -c | gawk '$1=='$i' {print $4}')
       #Si la prioridad del proceso a limitar es menor a la prioridad inferior, entonces se reduce un nivel de prioridad
       if [[ $PRIORITY -lt 19 ]] ; then
((PRIORITY=PRIORITY+1))
       #Se reduce la prioridad del proceso
       renice -n $PRIORITY -p $i
       #Si no se puede reducir más la prioridad del proceso, entonces se limita con cpulimit
       else
       cpulimit -p $i -l $CPU_LIMIT -z &
       fi
   done
done