Почему os.nice(10) не работает на OS X?

Почему бы os.nice(10) потерпеть неудачу с OSError: [Errno 1] Operation not permitted на OS X? Запуск от стандартной учетной записи пользователя:

$ 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 ответа

Решение

Как указал Лукас Граф, os.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)'

работает. Простая программа на С демонстрирует ту же проблему:

#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's nice утилита использует setpriority поэтому он игнорирует предел, но nice Функция C (которая используется непосредственно Python) заботится. Если приоритет процесса равен 20 или выше, nice попытается установить приоритет 19, что недопустимо (поскольку это увеличит приоритет процесса, что может сделать только привилегированный пользователь).

Это странная ошибка, но ее легко избежать, никогда не используя приоритет процесса 20.

Проверьте, какой у вас PRIO_MAX и какие нюансы разрешено использовать не суперпользователям

Пользователи, кроме суперпользователя, могут изменять только приоритет процессов, которыми они владеют, и могут только монотонно-монотонно-монотонно увеличивать свое "хорошее значение" в диапазоне от 0 до PRIO_MAX (20).

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

Другие вопросы по тегам