遍历pgrep结果

时间:2019-01-17 19:26:17

标签: bash macos

上下文:Dropbox会定期占用我100%的CPU,这使笔记本电脑的边界线无法使用。工具cputhrottle可以限制任何给定进程(PID)使用的CPU数量。

Dropbox实际上在我的机器上有几个PID,我想使用bash对其进行循环。

我最接近单线的是:

mawk

这有两个问题:

  1. cputhrottle引发错误(直接调用时不会显示):pgrep -f Dropbox | xargs -I{} cputhrottle {} 30 &

  2. 使进程后台似乎不起作用(第一个失败,并且进程仍在前台。我不确定这是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

1 个答案:

答案 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马赫陷阱的来源(如果您感到好奇的话):

https://github.com/apple/darwin-xnu/blob/a449c6a3b8014d9406c2ddbdc81795da24aa7443/bsd/vm/vm_unix.c#L783-L929

为了更好地解释您所看到的错误消息,退出代码5实际上是KERN_FAILURE,它是通用的通称,表示被调用的内核函数未成功。在这种情况下,可能是由于无效的安全权限所致。

https://github.com/apple/darwin-xnu/blob/0a798f6738bc1db01281fc08ae024145e84df927/osfmk/mach/kern_return.h#L94-L96