代码之家  ›  专栏  ›  技术社区  ›  Jason Sundram Red Alert

迭代pgrep结果

  •  0
  • Jason Sundram Red Alert  · 技术社区  · 7 年前

    Dropbox周期性地占用我100%的CPU,使我的笔记本电脑无法使用。工具 cputhrottle 使得限制任何给定进程(PID)使用的CPU数量成为可能。

    Dropbox实际上在我的机器上有几个PID,我想使用bash来循环它们。

    我最接近一行的是:

    pgrep -f Dropbox | xargs -I{} cputhrottle {} 30 &

    这有两个问题:

    1. cputrottle抛出一个错误(当直接调用该错误时不会引发此错误): 1libc++abi.dylib: terminating with uncaught exception of type Process::ManipulatorException: Error on task_for_pid of pid 720, res = 5

    2. 后台进程似乎不起作用(第一个进程失败,进程仍在前台)。我不确定这是1的结果还是另一个问题。

    我不确定是否应该放弃一行,但我不确定如何使以下循环工作:

    for i in $(pgrep -f Dropbox); do 
        cputhrottle $i 30 &
    done
    

    给出 syntax error near unexpected token ';'

    1 回复  |  直到 7 年前
        1
  •  1
  •   Swiss    7 年前

    苹果改变了他们的操作系统安全模式,打破了 task_for_pid 功能 cputhrottle 依赖。变化似乎要破裂了 节流阀 我怀疑 节流阀 当您手动调用它时,它实际上也不工作。

    苹果似乎真的想阻止 塔斯克福勒 而且,由于目前它在AppleAPI文档中完全没有文档记录,并且在任何地方的任何文档中都很难找到对它的任何引用。我不知道为什么作者 节流阀 选择使用这个特定的函数来构建他的程序。

    如果您真的想这样做,您可以重新构建cputrottle以获得正确的安全权限。

    这里的另一个解决方案是找到另一个要使用的程序。也许只是使用内置的 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

    源于 塔斯克福勒 马赫陷阱,如果你好奇的话:

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

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

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