原帖:https://ubuntuforums.org/showthread.php?t=992706
安装cpulimit&gawk
sudo apt-get install cpulimit sudo apt-get install gawk
创建文件
cpulimit_daemon.sh
#!/bin/bash # ============================================================== # CPU limit daemon - set PID's max. percentage CPU consumptions # ============================================================== # Variables CPU_LIMIT=20 # Maximum percentage CPU consumption by each PID DAEMON_INTERVAL=3 # Daemon check interval in seconds BLACK_PROCESSES_LIST= # 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
保存至/usr/bin/cpulimit_daemon.sh
- CPU_LIMIT: 这是每个程序能使用的最大CPU资源。默认值为 20%。
- DAEMON_INTERVAL: 这是脚本检查CPU情况的间隔时间,默认值为3秒。
- BLACK_ PROCESS_ LIST: 这是指定只监视某些特定进程时用的黑名单。有多个进程的话,可以用 “|” 隔开。 例如, “mysql|firefox|gedit”。
- WHITE_ PROCESSES_ LIST: 这是指定某些特定进程不用监视时用的白名单。 用法同上。
- 注意: 黑名单和白名单至少要有一个为空白——不能同时使用这两者。
修改文件权限
sudo chmod 755 /usr/bin/cpulimit_daemon.sh
cpulimit
原话是
Open text editor with root privileges and save bellow script to new file /etc/init.d/cpulimit
#!/bin/sh # # Script to start CPU limit daemon # set -e case "$1" in start) if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) -eq 0 ]; then nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 & ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }' else echo " * cpulimit daemon can't be started, because it is already running" fi ;; stop) CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l) CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE)) if [ $CPULIMIT_ALL -gt 0 ]; then if [ $CPULIMIT_DAEMON -gt 0 ]; then ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | xargs kill -9 # kill cpulimit daemon fi if [ $CPULIMIT_INSTANCE -gt 0 ]; then ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9 # release cpulimited process to normal priority fi ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }' else echo " * cpulimit daemon can't be stopped, because it is not running" fi ;; restart) $0 stop sleep 3 $0 start ;; status) ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }' ;; esac exit 0
修改其访问权限并使其开机自启动
sudo chown root:root /etc/init.d/cpulimit sudo chmod 755 /etc/init.d/cpulimit sudo update-rc.d cpulimit defaults
重启
sudo reboot
MANUALLY CHECK, STOP, START AND RESTART DAEMON
sudo service cpulimit status sudo service cpulimit start sudo service cpulimit stop sudo service cpulimit restart
UNINSTALL CPULIMIT DAEMON AND CPULIMIT PROGRAM
sudo service cpulimit stop # Stop cpulimit daemon and all cpulimited processes sudo update-rc.d -f cpulimit remove # Remove symbolic links sudo rm /etc/init.d/cpulimit # Delete cpulimit boot-up script sudo rm /usr/bin/cpulimit_daemon.sh # Delete cpulimit daemon script sudo apt-get remove cpulimit sudo apt-get remove gawk