Advertisement
Guest User

Untitled

a guest
Aug 15th, 2017
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.88 KB | None | 0 0
  1. #!/bin/bash
  2. # ==============================================================
  3. # CPU limit daemon - set PID's max. percentage CPU consumptions
  4. # ==============================================================
  5.  
  6. # Variables
  7.  
  8. CPU_LIMIT_SOFT=60 # Мягкое ограничение (применяется когда загрузка системы не большая)
  9. CPU_LIMIT_HARD=25 # Жесткое ограничение (когда загрузка системы большая)
  10.  
  11. LOAD_AVERAGE_LIMIT=2 # Загрукзам системы после которой начинают применяться жесткие ограничения (установите 0, если не знаете что это)
  12.  
  13. DAEMON_INTERVAL=4   # Daemon check interval in seconds
  14.  
  15. BLACK_PROCESSES_LIST="vivaldi-bin|opera-beta|megasync"   # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
  16.  
  17. ################################################################################
  18. if [[ $LOAD_AVERAGE_LIMIT -eq 0 ]] ; then
  19.     LOAD_AVERAGE_LIMIT=`grep -c '^processor' /proc/cpuinfo`
  20. fi
  21.  
  22. NEW_PIDS_COMMAND_SOFT="LC_ALL=C top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT_SOFT {print \$1}' CPU_LIMIT_SOFT=$CPU_LIMIT_SOFT"
  23. NEW_PIDS_COMMAND_HARD="LC_ALL=C top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT_HARD {print \$1}' CPU_LIMIT_HARD=$CPU_LIMIT_HARD"
  24.  
  25. STATE_COMMAND="cat /proc/loadavg | gawk '\$1>LOAD_AVERAGE_LIMIT {print HARD}' LOAD_AVERAGE_LIMIT=$LOAD_AVERAGE_LIMIT HARD='HARD'" ;
  26.  
  27. # Search and limit violating PIDs
  28. while sleep $DAEMON_INTERVAL
  29. do
  30. echo ''
  31.     LOAD_AVERAGE_STATE=$(eval "$STATE_COMMAND");
  32.    
  33.     if [[ $LOAD_AVERAGE_STATE == 'HARD' ]] ; then
  34.         NEW_PIDS_COMMAND=$NEW_PIDS_COMMAND_HARD;
  35.         CPU_LIMIT=$CPU_LIMIT_HARD;
  36.         echo "LA state: $LOAD_AVERAGE_STATE";
  37.     else
  38.         NEW_PIDS_COMMAND=$NEW_PIDS_COMMAND_SOFT;
  39.         CPU_LIMIT=$CPU_LIMIT_SOFT;
  40.     fi
  41.    
  42.    
  43.    
  44.     LIMITED_PIDS=$(ps -eo args | gawk '($1=="cpulimit") && ($5==CPU_LIMIT) {print $3}' CPU_LIMIT=$CPU_LIMIT) # Уже ограниченные PID'ы с нужным CPU_LIMIT
  45.     INCORRECT_LIMIT_PIDS=$(ps -eo pid,args | gawk '($2=="cpulimit") && ($6!=CPU_LIMIT) {print $1}' CPU_LIMIT=$CPU_LIMIT) # Already limited PIDs
  46.     NEW_PIDS=$(eval "$NEW_PIDS_COMMAND")                                                                    # Violating PIDs
  47.     QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')   # PIDs in queue
  48.  
  49. #LIMITED_PIDS_echo=$(ps -eo args | gawk '($1=="cpulimit") && ($5==CPU_LIMIT)' CPU_LIMIT=$CPU_LIMIT)
  50. #if [[ $LIMITED_PIDS_echo == '' ]] ; then
  51. #    echo ''  
  52. #    echo 'LIMITED_PIDS';
  53. #    echo $LIMITED_PIDS_echo
  54. #fi
  55. #
  56. #INCORRECT_LIMIT_PIDS_echo=$(ps -eo pid,args | gawk '($2=="cpulimit") && ($6!=CPU_LIMIT) {print $1}' CPU_LIMIT=$CPU_LIMIT)
  57. #if [[ $INCORRECT_LIMIT_PIDS_echo == '' ]] ; then
  58. #    echo ''  
  59. #    echo 'INCORRECT_LIMIT_PIDS';
  60. #    echo $INCORRECT_LIMIT_PIDS_echo
  61. #fi
  62.  
  63.     for i in $INCORRECT_LIMIT_PIDS
  64.     do
  65.         kill $i # снимает некоректные ограничения
  66.         echo 'kill ' $i
  67.     done
  68.    
  69.     for i in $QUEUE_PIDS
  70.     do
  71.         cpulimit -p $i -l $CPU_LIMIT -z &   # Limit new violating processes
  72.     done
  73. #LIMITED_PIDS_echo=$(ps -eo args | gawk '($1=="cpulimit") && ($5==CPU_LIMIT)' CPU_LIMIT=$CPU_LIMIT)
  74. #if [[ $LIMITED_PIDS_echo == '' ]] ; then
  75. #    echo ''  
  76. #    echo 'LIMITED_PIDS';
  77. #    echo $LIMITED_PIDS_echo
  78. #fi
  79. #
  80. #INCORRECT_LIMIT_PIDS_echo=$(ps -eo pid,args | gawk '($2=="cpulimit") && ($6!=CPU_LIMIT) {print $1}' CPU_LIMIT=$CPU_LIMIT)
  81. #if [[ $INCORRECT_LIMIT_PIDS_echo == '' ]] ; then
  82. #    echo ''  
  83. #    echo 'INCORRECT_LIMIT_PIDS';
  84. #    echo $INCORRECT_LIMIT_PIDS_echo
  85. #fi
  86. #
  87. #echo ''
  88. echo 'LIMITED';
  89. echo $(ps -eo args | gawk '($1=="cpulimit")')
  90.  
  91. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement