¿Cómo comienzo un proceso con un buen valor de -20 y no le doy el privilegio de root?

18

Me gustaría comenzar un proceso con un buen valor de -20. Esto requiere que use un comando como - sudo nice -n -20 matlab. Sin embargo, esto también inicia matlab como root. ¿Hay alguna manera de tener matlab como no root?

Mi enfoque actual es ... sudo nice -n -20 sudo -u myusername matlab, que, para mí, parece un truco. ¿Hay un enfoque directo para hacer esto?

Lord Loh
fuente
Deberías poder soltar el sudo. rootNo es necesario para completar su propio proceso.
jordanm
8
Si desea establecer una prioridad más alta que la predeterminada, necesita superusuario. (-20 es la prioridad más alta). La única otra forma en que se me ocurre hacer esto es sudo renice después de que se inicia. Sin embargo, dado que está ejecutando matlab de forma interactiva, es más fácil decirlo que hacerlo.
Alan Shutko
1
No es un truco, ese es el camino a seguir.
Hauke ​​Laging
@jordanm: sin un sudo, este es el comando correcto, nice -n -20 matlaby esta es la salida agradable: no se puede establecer la bondad: permiso denegado. Matlab se inicia y el buen valor es 0.
Lord Loh.
@AlanShutko: podría ejecutar system('sudo renice ...')MATLAB, pero matlab inicia 2 procesos: MATLAB y matlab_helper. Puede que tenga que hacerlo en ambos. Además, también quiero que todos mis procesos de MATLAB sean de alta prioridad, cuando empiezo matlabpool local a procesar en paralelo. @HaukeLaging: estoy empezando a pensar que tienes razón.
Lord Loh

Respuestas:

20

Lo comenzaría normalmente y luego usaría "renice" ...

Sin embargo, pude hacer un truco rápido junto con "su" que funciona:

sudo nice -n -20 su -c command_to_run user_to_run_as

(Si no tiene que darle una contraseña a sudo, tal vez porque ya la acaba de dar, puede agregar un "&" para dejar todo en segundo plano).

Como ya te has convertido en root con el comando sudo, su no te pedirá una contraseña. Pude iniciar un programa X desde un emulador de terminal bajo X. Si desea ejecutar el programa X como otro usuario que no sea el usuario propietario de la sesión X, probablemente deba decirle explícitamente a X que lo permita (abierto para clientes X de ese usuario).

Baard Kopperud
fuente
1
Gracias. Así que creo que la forma en que pensé era la única manera de hacerlo.
Lord Loh
¡Esto funciona! Lo único que me encuentro ahora es que no tengo salida estándar. ¿Cómo resolver esto? Por ejemplo, sudo nice -n 19 su -c $(echo "test")no da salida.
DrumM
Lo malo es que debes hacer sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do`, consulta stackoverflow.com/a/3727572/2522849
DrumM el
8

Un paso más allá @ Jordania, aquí está la solución elegante contra el sudo nice -n -xx su <username> -c matlabhack

Nota: Usando username = sid , matlab meta-data dir = / var / lib / matlab , nice = -10 cambio a voluntad

  1. Crear directorio de metadatos de matlab (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Agregar usuario especificado para iniciar matlab y persimisson derecho

    sudo useradd -d / var / lib / matlab sid
    sudo chown sid: sid / var / lib / matlab
  1. Establecer contraseña de usuario (sid)

    sudo passwd sid

  2. Agregue lo siguiente a /etc/security/limits.conf

    sid - priority -10

  3. Configurar y copiar ssh-key para automatizar el inicio de sesión (OPCIONAL)

    ssh-keygen -t rsa # siguiente clave passwd misceláneo   
    ssh-copy-id sid @ localhost #using sid's passwd
  1. Crear envoltorio de shell matlab (corregir error silencioso ERR )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Un contenedor para lanzar matlab
    / usr / local / MATLAB / <versión> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Shell de inicio de sesión de Ajust sid

    sudo usermod -s /usr/local/bin/wmatlab sid

  2. iniciar matlab usando ssh con Xforward

    ssh -X sid@localhost

Jiahao D.
fuente
2
Esta debería ser la respuesta aceptada.
user47093
4

He descubierto que esto podría hacerse modificando el archivo /etc/security/limits.conf(al menos en algunas distribuciones de Linux). En mi caso, simplemente agregué

#<domain> <type> <item> <value> my_user - nice -20

entonces puedes ejecutar

nice -n -20 matlab

Guyik
fuente
Después de hacer este cambio, debe cerrar sesión / volver a iniciar sesión: unix.stackexchange.com/q/108603/247665
shaneb
2

Como @jordanm dijo soltar sudo. Puede ajustar sus propios procesos para darles una prioridad más baja:

nice -20 matlab

No se sudo.

John
fuente
Esto no funcionó. system('ps a -o pid -o comm -o nice')me tiene 13580 MATLAB 19- MATLAB se ejecuta con la prioridad más baja en lugar de la más alta. Mi pregunta era cómo aumentar la prioridad y no reducirla.
Lord Loh
Sin a sudo, este es el comando correcto, nice -n -20 matlaby este es el resultado nice: cannot set niceness: Permission denied. Matlab se inicia y el buen valor es 0.
Lord Loh.
3
OP no quiere aumentar la prioridad (negativo bueno), es decir. "nice --20 mathlab" (doble -) en la notación anterior, "nice -n -20 mathlab" en la nueva. Solo root puede usar valores agradables negativos.
Baard Kopperud
1
CAP_SYS_NICE también permitiría que el OP haga esto sin privilegios de root, pero implica profundizar en las capacidades de Linux (algo que no mucha gente entiende y podría ser más trabajo de lo que vale). Solo lo menciono por completo.
Bratchley
1

pam le permite establecer límites en nice por grupo su archivo de configuración:

@grnice prioridad dura -20

@grnice duro agradable -20

Y asegúrese de que el grupo el proceso se ejecute de manera grnice.

Jordán
fuente
1

Agregue el usuario a sudoers (en realidad, un nuevo archivo en /etc/sudoers.d, pero es la misma premisa):

niceuser ALL=NOPASSWD:/usr/bin/nice

Entonces, como el "niceuser":

niceuser@localhost $ sudo nice -n -10 command...

y hace lo que necesito (es decir, mi usuario ahora puede aumentar la prioridad de {comando ...}). Es compatible con múltiples usuarios, etc. - se usa man 5 sudoerspara más detalles.

enjugador de goma
fuente
44
Eso todavía ejecuta el comando como root, que es lo que el póster intenta evitar.
Kyle Butt
1

Otra opción posible (simple, pero menos segura) es habilitar el permiso setuid / setgid para el niceejecutable.

sudo chmod +s /usr/bin/nice

setuid asigna a cualquier usuario que pueda ejecutar el archivo el UID efectivo del propietario del archivo (en este caso root) al ejecutar el archivo, por lo tanto, es equivalente a ejecutarse como ese usuario. setguid hace lo mismo para un GID efectivo.


O puede hacerlo de manera más segura:

# create a system group named `nice'
groupadd -r nice

# set the owner group for `nice' executable
chgrp nice /usr/bin/nice

# disallow other users to run `nice`
chmod o-x /usr/bin/nice

# allow anyone who are able to execute the file gain a setuid as root
chmod u+s /usr/bin/nice

# add your user to the group
usermod -a -G nice <your-user-name>

Tenga en cuenta que debe volver a iniciar sesión en su cuenta para que el nuevo grupo surta efecto.

Shou Ya
fuente