Guest User

Untitled

a guest
Aug 17th, 2017
132
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2. # ==============================================================
  3. # CPU limit daemon - set PID's max. percentage CPU consumptions
  4. # ==============================================================
  5.  
  6. # Variables
  7. CPU_LIMIT=32
  8.  
  9. LOAD_AVERAGE_LIMIT=2 # Уровень LA после которого демон считает что система перегружена (установите 0, если не знаете что это)
  10.  
  11. DAEMON_INTERVAL=2   # Daemon check interval in seconds
  12.  
  13. INTERVALS_BEFORE_THAW=8 # Количество интервалов без System overload или выставления лимитов, пропускаемых от снятия всех лимитов
  14.  
  15. BLACK_PROCESSES_LIST="vivaldi|opera|megasync"   # Черный список приложений, которые будут ограничиваться даже если система не нагружена
  16. WHITE_PROCESSES_LIST=""   # Белый список приложений, которые не буду ограничиваться даже если система перегружена
  17.  
  18. ################################################################################
  19. if [[ $LOAD_AVERAGE_LIMIT -eq 0 ]] ; then
  20.     LOAD_AVERAGE_LIMIT=`grep -c '^processor' /proc/cpuinfo`
  21. fi
  22.  
  23. if [[ $WHITE_PIDS_COMMAND != '' ]] ; then
  24.     WHITE_PIDS_COMMAND="LC_ALL=C top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT";
  25. else
  26.     WHITE_PIDS_COMMAND="LC_ALL=C top -b -n1 -c | gawk 'NR>6' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT";
  27. fi
  28. BLACK_PIDS_COMMAND="LC_ALL=C top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
  29.  
  30. STATE_COMMAND="cat /proc/loadavg | gawk '\$1>LOAD_AVERAGE_LIMIT {print overload}' LOAD_AVERAGE_LIMIT=$LOAD_AVERAGE_LIMIT overload='overload'" ;
  31.  
  32. BEFORE_THAW=-1;
  33. # Search and limit violating PIDs
  34. ################################################################################
  35. while sleep $DAEMON_INTERVAL
  36. do
  37. echo '==============================================================================='
  38.     LOAD_AVERAGE_STATE=$(eval "$STATE_COMMAND");
  39.     if [[ $LOAD_AVERAGE_STATE == 'overload' ]] ; then
  40.         NEW_PIDS=$(eval "$WHITE_PIDS_COMMAND");
  41.         BEFORE_THAW=$INTERVALS_BEFORE_THAW; # перегрузка - полностью откладываем оттепель
  42.         echo "System overload!";
  43.     else
  44.         if [[ $BEFORE_THAW -eq 0 ]] ; then
  45.             killall cpulimit;
  46.             BEFORE_THAW=-1;
  47.             echo 'Thaw';
  48.             sleep $DAEMON_INTERVAL;
  49.         else
  50.             BEFORE_THAW=$(($BEFORE_THAW - 1));
  51.             echo "Intervals before thaw: $BEFORE_THAW"
  52.         fi
  53.         NEW_PIDS=$(eval "$BLACK_PIDS_COMMAND");
  54.     fi
  55.  
  56.     if [[ $NEW_PIDS != '' ]] ; then # есть процессы нарушители
  57.         NEW_PIDS=$(echo $NEW_PIDS)
  58. #echo ''
  59. #echo 'New pids:'
  60. #LC_ALL=C top -b -n1 -c -p ${NEW_PIDS//[[:space:]]/" -p "} | gawk 'NR>6'
  61.    
  62.         LIMITED_PIDS=$(ps -eo args | gawk '($1=="cpulimit") {print $3}' CPU_LIMIT=$CPU_LIMIT) # PID'ы в отношении которых уже действую ограничения
  63.         PIDS4LIMIT=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')
  64.        
  65.         if [[ $PIDS4LIMIT != '' ]] ; then
  66.             BEFORE_THAW=$(($INTERVALS_BEFORE_THAW - 1)); # на один инервал меньше
  67.             for i in $PIDS4LIMIT # перебираем процессы которые следуюет ограничить и выставляем для них предварительное ограничение
  68.             do
  69.                 cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
  70.             done
  71.         fi
  72.    
  73.     fi
  74.    
  75. LIMITED_PIDS=$(ps -eo args | gawk '($1=="cpulimit") {print $3}' CPU_LIMIT=$CPU_LIMIT) # PID'ы в отношении которых уже действую ограничения
  76. if [[ $LIMITED_PIDS != '' ]] ; then
  77.     echo ''
  78.     echo 'Current limited pids:'
  79.     LC_ALL=C top -b -n1 -c -p ${LIMITED_PIDS//[[:space:]]/" -p "} | gawk 'NR>6'
  80. fi
  81. done
RAW Paste Data