Answers:
它不完全是您想要的,但是,就Google Drive和Chrome而言,这对我有用的是:
Google云端硬盘(“备份和同步”)
取消优先级:
for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
恢复正常:
for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice 0 -p $f; done
铬
取消当前所有流程的优先级:
for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
将所有当前流程恢复正常:
for f in $(pgrep 'Chrome'); do renice 0 -p $f; done
cputhrottle
是您需要的工具。您可以使用Homebrew安装它。
您可以通过运行以下Bash脚本来按名称监视一系列进程。我不太清楚如何将其转换为登录项,因为cputhrottle
需要超级用户权限。在Automator工作流程中,将其作为脚本运行,无论如何:
# Get the Process/App names from Activity Monitor and put them here
apps=("AppOne" "AppTwo" "AppThree")
# Set the respective limits here
limits={30 40 50)
while true; do
for app in ${apps}; do
for limit in ${limits}; do
for pid in $(pgrep ${app}); do
sudo /path/to/cputhrottle ${pid} ${limit}
done
done
done
done
[编辑]
我为此脚本添加了一个不同的版本(一个bash
脚本),这对于希望限制多个应用程序的CPU的人可能有用。
此新脚本还允许您指定一个列表,其中包含应用程序名称和CPU限制。
主要区别在于您可以为每个应用程序添加cpu限制,并且每个应用程序只能运行一次。我还添加了用于终止所有cputhrottle
进程的选项。
该脚本假定两者都已安装,cputhrottle
并且pidof
在运行之前已安装。
#!/bin/bash
if [[ $EUID > 0 ]]; then
echo "Please run this script as root/sudo"
exit 1
fi
# Pass --kill as argument to kill all running cputhrottles
if [ $1 = "--kill" ]; then
echo "Looking for running cputhrottles..."
pids=`pidof cputhrottle`
for pid in ${pids}; do
echo "> Killing PID ${pid}"
sudo kill ${pid}
done
echo "Done!"
exit 0
fi
declare -a applications
# Syntax='application;max-cpu'
applications[0]='Chrome;40'
applications[1]='Firefox;50'
applications[2]='pycharm;40'
applications[3]='webstorm;40'
applications[4]='Safari;35'
for i in "${applications[@]}"; do
app=(${i//;/ })
app_name=${app[0]}
cpu_limit=${app[1]}
printf "\nLooking for ${app_name}...\n"
pids=`pidof ${app}`
for pid in ${pids}; do
echo "> PID=${pid}, CPU=${cpu_limit}"
sudo cputhrottle ${pid} ${cpu_limit} &
done
done
printf "\nDone!\n"
echo "Run this script passing '--kill' as argument to remove all cputhrottles."
资源:
尽管这不是OP问题的直接答案,但是如果您遇到某个特定进程的问题,该进程占用了过多的CPU时间,并使计算机无法使用,并且您不介意该进程需要多长时间才能完成它正在处理的任务,您可以使用renice
更改该进程的优先级,使其表现良好(因此得名)。
首先,您需要找到正在消耗CPU资源的进程的PID。您可以在“活动监视器”中或使用以下ps
命令在Terminal.app中执行此操作-例如,找到Safari浏览器的PID,请键入:
MacBook:~😈 ps -ef | grep Safari
501 17452 263 0 11:36pm ?? 4:15.60 /Applications/Safari.app/Contents/MacOS/Safari
上面的第二行是输出,在此特定情况下,PID为17452。
然后,下一个任务是更改进程的优先级(假设我们要使Safari表现良好)。为此,请在Terminal.app中输入:
MacBook:~😈 renice -n 10 -p 17452
该-n
选项通过将10加到当前值(默认为0)来更改漂亮级别。值的范围是-20到20,最小值表示最高优先级。作为普通用户,您可以使用0到20的值。要分配负值,您需要具有root特权(例如use sudo
命令)。了解更多关于nice
和renice
通过打字man nice
和man renice
在Terminal.app。
nice
并且renice
不限制给定应用程序本身可用的CPU百分比,但是,它们确实允许更改调度优先级,换句话说,一个进程将获得多少CPU时间。这都是与系统上的CPU负载有关的,因此,如果系统未充分利用,您很可能看不到任何区别。
有一个简单的方法可以完成所有这些工作:
ps axu | grep Chromium | grep -v grep | awk '{print $2}' | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'
输入您的应用名称(而不是Chromium)和所需的百分比(而不是10),就可以了!
pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'
。但是,我不确定macOS是否pgrep
已安装。
这是基于先前的答案的,但是添加了ctrl + c的陷阱以确保被限制的进程保持在继续状态,并进行添加, set -e
因此,如果进程本身退出,此脚本将干净地退出:
trap ctrl_c_fn INT
function ctrl_c_fn() {
echo "caught CTRL-C, exiting"
kill -SIGCONT $pid
exit
}
echo "enter process id"
read pid
echo "press Ctrl-C to exit"
set -e
while true; do
kill -SIGSTOP $pid
sleep 0.009
kill -SIGCONT $pid
sleep 0.001
done
Nicholas Smith发布的链接不再起作用。因此,我发现了另一个应用程序,该应用程序可以为再次搜索该应用程序的人们提供帮助。该应用会调用Apppolice。
这是我的最后一个脚本,请保持清洁,命令cputhrottle仅在不存在时执行新命令
#!/bin/bash
###
# setup cputhrottle if doesn't exists
###
set_service_cpu_limit(){
service_pid=$(pgrep $1)
limit=$2
if [[ ! -z $service_pid ]]; then
service_cpu=$(ps aux | grep "sudo cputhrottle $service_pid $limit" | grep -v grep | wc -l)
if [[ ! $service_cpu -gt 0 ]]; then
sudo cputhrottle $service_pid $limit &
fi
fi
}
###
# main loop
###
while true; do
set_service_cpu_limit bzfilelist 2
set_service_cpu_limit bztransmit 2
sleep 0.5
done
这对我有用
echo "enter process id"
read pid
echo "press Ctrl-C to exit"
while true; do
kill -SIGSTOP $pid
sleep 0.009
kill -SIGCONT $pid
sleep 0.001
done