Come posso avviare un processo con un buon valore di -20 e non dargli il privilegio di root?


18

Vorrei iniziare un processo con un buon valore di -20. Ciò richiede che io usi un comando come - sudo nice -n -20 matlab. Tuttavia, questo avvia matlab anche come root. C'è un modo per avere matlab come non root?

Il mio approccio attuale è - sudo nice -n -20 sudo -u myusername matlab- che, per me sembra un trucco. Esiste un approccio diretto per farlo?


Dovresti essere in grado di rilasciare il file sudo. rootnon è necessario per rendere piacevole il proprio processo.
Giordania,

8
Se si desidera impostare una priorità più alta rispetto a quella predefinita, è necessario un superutente. (-20 è la massima priorità.) L'unico altro modo in cui mi viene in mente di farlo sarebbe quello di sudo renice dopo che è stato avviato. Tuttavia, poiché stai eseguendo matlab in modo interattivo, è più facile a dirsi che a farsi.
Alan Shutko,

1
Non è un trucco, questa è la strada da percorrere.
Hauke ​​Laging,

@jordanm - Senza un sudo, questo è il comando giusto - nice -n -20 matlabe questo è l'output piacevole: impossibile impostare la gentilezza: autorizzazione negata. Matlab si avvia e il valore piacevole è 0.
Lord Loh.

@AlanShutko - Potrei eseguire system('sudo renice ...')MATLAB, ma matlab avvia 2 processi: MATLAB e matlab_helper. Potrei doverlo fare su entrambi. inoltre voglio anche che tutti i miei processi MATLAB abbiano la massima priorità - quando inizio matlabpool local per l'elaborazione parallela. @HaukeLaging - Sto cominciando a pensare che tu abbia ragione.
Lord Loh.

Risposte:


20

Vorrei iniziare normalmente e utilizzare "renice" in seguito ...

Tuttavia sono stato in grado di fare un trucco rapido insieme a "su" che funziona:

sudo nice -n -20 su -c command_to_run user_to_run_as

(Se non devi dare a sudo una password - forse perché l'hai già fornita - puoi aggiungere un "&" per mettere tutto in background.)

Dato che sei già diventato root con il comando sudo, su non ti chiederà una password. Sono stato in grado di avviare un programma X da un emulatore di terminale in X. Se si desidera eseguire il programma X come altro utente rispetto all'utente che possiede la sessione X, probabilmente sarà necessario dire esplicitamente a X per consentirlo (aperto per X-client da quell'utente).


1
Grazie. Quindi penso che il modo in cui ho pensato fosse l'unico modo per farlo.
Lord Loh.

Questo funziona! L'unica cosa che sto incontrando ora è che non ho un output standard. Come risolverlo? Ad esempio, sudo nice -n 19 su -c $(echo "test")non fornisce alcun output.
DrumM,

Il mio male, è necessario fare sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do`, vedi stackoverflow.com/a/3727572/2522849
Drumm

8

Un passo avanti @Jordan, ecco l'elegante soluzione contro l' sudo nice -n -xx su <username> -c matlabhack

Nota: Usando username = sid , matlab meta-data dir = / var / lib / matlab , nice = -10 cambia a tuo piacimento

  1. Crea dir metadati matlab (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Aggiungi l'utente specificato per avviare matlab e right persimisson

    sudo useradd -d / var / lib / matlab sid
    sudo chown sid: sid / var / lib / matlab
  1. Imposta la password utente (sid)

    sudo passwd sid

  2. Aggiungi in seguito a /etc/security/limits.conf

    sid - priority -10

  3. Installa e copia ssh-key per automatizzare il login (OPZIONALE)

    ssh-keygen -t rsa #following key passwd misc   
    ssh-copy-id sid @ localhost #usando il passwd di sid
  1. Crea wrapper shell matlab (correggi errore ERR non presidiato )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Un wrapper per avviare matlab
    / usr / local / MATLAB / <versione> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Shell di login di Ajust Sid

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

  2. avvia matlab usando ssh con Xforward

    ssh -X sid@localhost


2
questa dovrebbe essere la risposta accettata.
user47093,

4

Ho scoperto che questo potrebbe essere fatto modificando il file /etc/security/limits.conf(almeno su alcune distro di Linux). Nel mio caso, ho semplicemente aggiunto

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

allora puoi eseguire

nice -n -20 matlab


Dopo aver apportato questa modifica, è necessario disconnettersi / accedere nuovamente: unix.stackexchange.com/q/108603/247665
shaneb

2

Come ha detto @jordanm, rilasciare sudo. Puoi semplificare i tuoi processi per dare loro una priorità inferiore:

nice -20 matlab

No sudo.


Questo non ha funzionato. system('ps a -o pid -o comm -o nice')mi ha preso 13580 MATLAB 19- MATLAB funziona con la priorità più bassa invece della più alta. La mia domanda era su come aumentare la priorità e non ridurla.
Lord Loh.

Senza a sudo, questo è il comando giusto - nice -n -20 matlabe questo è l'output nice: cannot set niceness: Permission denied. Matlab si avvia e il valore piacevole è 0.
Lord Loh.

3
OP non vuole aumentare la priorità (negativo positivo), cioè. "nice --20 mathlab" (doppio -) nella vecchia notazione, "nice -n -20 mathlab" nella nuova. Solo root può usare valori positivi negativi.
Baard Kopperud,

1
CAP_SYS_NICE consentirebbe anche all'OP di fare questo senza i privilegi di root, ma implica approfondire le capacità di Linux (qualcosa che non molte persone capiscono e potrebbe essere più lavoro di quanto valga la pena). Ne ho appena parlato per completezza.
Bratchley,


1

pam ti permette di impostare limiti su nice per gruppo il suo file di configurazione:

@grnice priorità assoluta -20

@grnice hard nice -20

E assicurati che il gruppo il processo venga eseguito in grnice.


1

Aggiungi l'utente a sudoers (in realtà, un nuovo file in /etc/sudoers.d, ma è la stessa premessa):

niceuser ALL=NOPASSWD:/usr/bin/nice

Quindi, come il "simpatico utente":

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

e fa quello di cui ho bisogno (ovvero, il mio utente ora può aumentare la priorità di {command ...}). Supporta più utenti, ecc. - utilizzare man 5 sudoersper i dettagli.


4
Ciò esegue ancora il comando come root, che è ciò che il poster sta cercando di evitare.
Kyle Butt,

1

Un'altra opzione possibile (semplice, ma meno sicura) è abilitare l'autorizzazione setuid / setgid per l' niceeseguibile.

sudo chmod +s /usr/bin/nice

setuid assegna a qualsiasi utente in grado di eseguire il file l'UID effettivo del proprietario del file (in questo caso root) durante l'esecuzione del file, quindi equivale a essere eseguito come quell'utente. setguid fa lo stesso per un GID efficace.


Oppure puoi farlo in modo più sicuro:

# 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>

Attenzione, è necessario accedere nuovamente al proprio account affinché il nuovo gruppo abbia effetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.