Created
July 25, 2014 17:50
-
-
Save jackyyf/8cdbd92c312cf81cc9ae to your computer and use it in GitHub Desktop.
Gist by paste.py @ 2014-07-26 01:50:04.495803
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# ============================================================== | |
# CPU limit daemon - set PID's max. percentage CPU consumptions | |
# ============================================================== | |
# Variables | |
CPU_LIMIT=3 # Maximum percentage CPU consumption by each PID | |
DAEMON_INTERVAL=3 # Daemon check interval in seconds | |
BLACK_PROCESSES_LIST="sshd" # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited. | |
WHITE_PROCESSES_LIST= # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited. | |
# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined. | |
if [[ -n "$BLACK_PROCESSES_LIST" && -n "$WHITE_PROCESSES_LIST" ]] ; then # If both variables are defined then error is produced. | |
echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty." | |
exit 1 | |
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command | |
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 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command | |
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 | |
# Search and limit violating PIDs | |
while sleep $DAEMON_INTERVAL | |
do | |
NEW_PIDS=$(eval "$NEW_PIDS_COMMAND") # Violating PIDs | |
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs | |
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue | |
for i in $QUEUE_PIDS | |
do | |
cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes | |
done | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment