上下文:Dropbox会定期占用我100%的CPU,这使笔记本电脑的边界线无法使用。工具cputhrottle可以限制任何给定进程(PID)使用的CPU数量。
Dropbox实际上在我的机器上有几个PID,我想使用bash对其进行循环。
我最接近单线的是:
mawk
这有两个问题:
cputhrottle引发错误(直接调用时不会显示):pgrep -f Dropbox | xargs -I{} cputhrottle {} 30 &
使进程后台似乎不起作用(第一个失败,并且进程仍在前台。我不确定这是1还是其他问题的结果。
我不确定是否应该放弃单线,但是我不确定如何进行以下for循环工作:
1libc++abi.dylib: terminating with uncaught exception of type Process::ManipulatorException: Error on task_for_pid of pid 720, res = 5
给出for i in $(pgrep -f Dropbox); do
cputhrottle $i 30 &
done
答案 0 :(得分:1)
Apple改变了其操作系统安全模型,打破了task_for_pid
所依赖的cputhrottle
功能。更改似乎中断了cputhrottle
,我怀疑当您手动调用cputhrottle
时,它实际上并没有起作用。
Apple似乎也确实希望阻止使用task_for_pid
,因为目前Apple API文档中尚未完全记录该文档,并且在任何地方的任何文档中尝试找到对它的引用也非常困难。我不知道为什么cputhrottle
的作者选择使用此特定功能来构建自己的程序。
如果确实愿意,您可以重建cputhrottle以具有正确的安全权限。
这里的另一个解决方案是找到要使用的另一个程序。也许只使用内置的nice
功能?
有关OS API安全性更改的参考:
http://os-tres.net/blog/2010/02/17/mac-os-x-and-task-for-pid-mach-call/ https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/RuntimeProtections/RuntimeProtections.html
task_for_pid
马赫陷阱的来源(如果您感到好奇的话):
为了更好地解释您所看到的错误消息,退出代码5实际上是KERN_FAILURE
,它是通用的通称,表示被调用的内核函数未成功。在这种情况下,可能是由于无效的安全权限所致。