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?
3 respuestas
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.
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))
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).