Почему 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