为什么os.nice(10)会在OS X上失败?

时间:2014-09-10 19:21:17

标签: python macos nice

为什么os.nice(10)会因OS X上的OSError: [Errno 1] Operation not permitted而失败?从标准用户帐户运行:

$ python
…
>>> os.nice(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 1] Operation not permitted

详细说明:

  • Python 2.7.2
  • OS X 10.8.4

2 个答案:

答案 0 :(得分:4)

正如Lukas Graf指出的那样,os.nice增加了不错的水平,而不是设定它。

这似乎是一个OS X错误,如果你以优先级20或更高的优先级调用nice,则会触发该错误:

nice -n 20 python -c 'import os; os.nice(10)'

失败,而

nice -n 19 python -c 'import os; os.nice(10)'

的工作原理。一个简单的C程序表现出同样的问题:

#include <unistd.h>
#include <string.h>

int main() {
    if(nice(10) < 0)
        perror("nice");
}

如果以nice -n 20 ./test运行,则会输出错误,但如果以nice -n 19 ./test运行则会成功。


原因是因为20级的优秀级别高于nice API(NZERO)支持的最高级别。 OS X的nice实用程序使用setpriority因此它忽略了限制,但nice C函数(由Python直接使用)确实关注。如果进程优先级为20或更高,nice将尝试将优先级设置为19,这是不允许的(因为它会增加进程优先级,只有特权用户可以这样做。)

这是一个奇怪的错误,但是从不使用20的进程优先级可以很容易地避免它。

答案 1 :(得分:1)

检查您的PRIO_MAX是什么以及非超级用户允许使用哪些好处

超级用户以外的用户可能只会改变他们拥有的进程的优先级,并且只能单调地单调增加他们在0到PRIO_MAX(20)范围内的“漂亮值”。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/renice.8.html