Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # ==============================================================
- # CPU limit daemon - set PID's max. percentage CPU consumptions
- # ==============================================================
- # Variables
- CPU_LIMIT_SOFT=60 # Мягкое ограничение (применяется когда загрузка системы не большая)
- CPU_LIMIT_HARD=25 # Жесткое ограничение (когда загрузка системы большая)
- LOAD_AVERAGE_LIMIT=2 # Загрукзам системы после которой начинают применяться жесткие ограничения (установите 0, если не знаете что это)
- DAEMON_INTERVAL=4 # Daemon check interval in seconds
- 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.
- ################################################################################
- if [[ $LOAD_AVERAGE_LIMIT -eq 0 ]] ; then
- LOAD_AVERAGE_LIMIT=`grep -c '^processor' /proc/cpuinfo`
- fi
- 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"
- 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"
- STATE_COMMAND="cat /proc/loadavg | gawk '\$1>LOAD_AVERAGE_LIMIT {print HARD}' LOAD_AVERAGE_LIMIT=$LOAD_AVERAGE_LIMIT HARD='HARD'" ;
- # Search and limit violating PIDs
- while sleep $DAEMON_INTERVAL
- do
- echo ''
- LOAD_AVERAGE_STATE=$(eval "$STATE_COMMAND");
- if [[ $LOAD_AVERAGE_STATE == 'HARD' ]] ; then
- NEW_PIDS_COMMAND=$NEW_PIDS_COMMAND_HARD;
- CPU_LIMIT=$CPU_LIMIT_HARD;
- echo "LA state: $LOAD_AVERAGE_STATE";
- else
- NEW_PIDS_COMMAND=$NEW_PIDS_COMMAND_SOFT;
- CPU_LIMIT=$CPU_LIMIT_SOFT;
- fi
- LIMITED_PIDS=$(ps -eo args | gawk '($1=="cpulimit") && ($5==CPU_LIMIT) {print $3}' CPU_LIMIT=$CPU_LIMIT) # Уже ограниченные PID'ы с нужным CPU_LIMIT
- INCORRECT_LIMIT_PIDS=$(ps -eo pid,args | gawk '($2=="cpulimit") && ($6!=CPU_LIMIT) {print $1}' CPU_LIMIT=$CPU_LIMIT) # Already limited PIDs
- NEW_PIDS=$(eval "$NEW_PIDS_COMMAND") # Violating PIDs
- QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue
- #LIMITED_PIDS_echo=$(ps -eo args | gawk '($1=="cpulimit") && ($5==CPU_LIMIT)' CPU_LIMIT=$CPU_LIMIT)
- #if [[ $LIMITED_PIDS_echo == '' ]] ; then
- # echo ''
- # echo 'LIMITED_PIDS';
- # echo $LIMITED_PIDS_echo
- #fi
- #
- #INCORRECT_LIMIT_PIDS_echo=$(ps -eo pid,args | gawk '($2=="cpulimit") && ($6!=CPU_LIMIT) {print $1}' CPU_LIMIT=$CPU_LIMIT)
- #if [[ $INCORRECT_LIMIT_PIDS_echo == '' ]] ; then
- # echo ''
- # echo 'INCORRECT_LIMIT_PIDS';
- # echo $INCORRECT_LIMIT_PIDS_echo
- #fi
- for i in $INCORRECT_LIMIT_PIDS
- do
- kill $i # снимает некоректные ограничения
- echo 'kill ' $i
- done
- for i in $QUEUE_PIDS
- do
- cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
- done
- #LIMITED_PIDS_echo=$(ps -eo args | gawk '($1=="cpulimit") && ($5==CPU_LIMIT)' CPU_LIMIT=$CPU_LIMIT)
- #if [[ $LIMITED_PIDS_echo == '' ]] ; then
- # echo ''
- # echo 'LIMITED_PIDS';
- # echo $LIMITED_PIDS_echo
- #fi
- #
- #INCORRECT_LIMIT_PIDS_echo=$(ps -eo pid,args | gawk '($2=="cpulimit") && ($6!=CPU_LIMIT) {print $1}' CPU_LIMIT=$CPU_LIMIT)
- #if [[ $INCORRECT_LIMIT_PIDS_echo == '' ]] ; then
- # echo ''
- # echo 'INCORRECT_LIMIT_PIDS';
- # echo $INCORRECT_LIMIT_PIDS_echo
- #fi
- #
- #echo ''
- echo 'LIMITED';
- echo $(ps -eo args | gawk '($1=="cpulimit")')
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement