Usando python, puedo aumentar fácilmente la simplicidad del proceso actual:

>>> import os
>>> import psutil

>>> # Use os to increase by 3
>>> os.nice(3)
3

>>> # Use psutil to set to 10
>>> psutil.Process(os.getpid()).nice(10)
>>> psutil.Process(os.getpid()).nice()
10

Sin embargo, parece que no está permitido disminuir la simplicidad de un proceso:

>>> os.nice(-1)
OSError: [Errno 1] Operation not permitted

>>> psutil.Process(os.getpid()).nice(5)
psutil.AccessDenied: psutil.AccessDenied (pid=14955)

¿Cuál es la forma correcta de hacer esto? ¿Y es el mecanismo de trinquete un error o una característica?

6
TDN169 11 dic. 2015 a las 18:32

3 respuestas

La mejor respuesta

Linux, por defecto, no permite que los usuarios no privilegiados disminuyan el valor agradable (es decir, aumenten la prioridad) de sus procesos, de modo que un usuario no cree un proceso de alta prioridad para privar a otros usuarios de hambre. Python simplemente reenvía el error que el sistema operativo le da como excepción.

El usuario root puede aumentar la prioridad de los procesos, pero ejecutarse como root tiene otras consecuencias.

7
Colonel Thirty Two 11 dic. 2015 a las 15:36

Tuve el mismo error [Errno 2] Operation not permitted.

No quiero comenzar mi script con sudo, así que encontré la siguiente solución:

def decrease_nice():
    pid = os.getpid()
    os.system("sudo renice -n -19 -p " + str(pid))

def normal_nice():
    pid = os.getpid()
    os.system("sudo renice -n 0 -p " + str(pid))
0
Javan R. 27 abr. 2019 a las 19:47

Esto no es una restricción de Python o de la interfaz os.nice. En man 2 nice se describe que solo el superusuario puede disminuir la simplicidad de un proceso:

nice () agrega inc al valor nice para el proceso de llamada. (Un valor agradable más alto significa una prioridad baja). Solo el superusuario puede especificar un incremento negativo o un aumento de prioridad. El rango de valores agradables se describe en getpriority (2).

3
Chris Seymour 11 dic. 2015 a las 15:59
34227066