0

为什么会在 OS X 上os.nice(10)失败?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
4

2 回答 2

4

正如 Lukas Graf 所指出的,os.nice增加 nice 级别,而不是设置它。

这似乎是一个 OS X 错误,如果您nice在优先级为 20 或更高的情况下调用,则会触发该错误:

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


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

这是一个奇怪的错误,但可以通过从不使用 20 的进程优先级来轻松避免。

于 2014-09-10T19:30:40.913 回答
1

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

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

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

于 2014-09-10T19:32:21.613 回答