Wie starte ich einen Prozess mit einem netten Wert von -20 und gebe ihm keine root-Berechtigung?

18

Ich möchte einen Prozess mit einem schönen Wert von -20 starten. Dazu muss ich einen Befehl wie - verwenden sudo nice -n -20 matlab. Dies startet matlab jedoch auch als root. Gibt es eine Möglichkeit, Matlab als Nicht-Root zu haben?

Mein aktueller Ansatz ist - sudo nice -n -20 sudo -u myusername matlab- was für mich wie ein Hack aussieht. Gibt es dafür einen direkten Ansatz?

Lord Loh.
quelle
Sie sollten in der Lage sein, die einfach fallen zu lassen sudo. rootist nicht nötig um deinen eigenen Prozess zu pflegen.
Jordanien
8
Wenn Sie eine höhere Priorität als die Standardpriorität festlegen möchten, benötigen Sie den Superuser. (-20 ist die höchste Priorität.) Die einzige andere Möglichkeit, die ich mir vorstellen kann, wäre, sudo renice nach dem Start auszuführen. Da Sie matlab jedoch interaktiv ausführen, ist dies leichter gesagt als getan.
Alan Shutko
1
Kein Hack, das ist der richtige Weg.
Hauke ​​Laging
@jordanm - Ohne Sudo ist dies der richtige Befehl - nice -n -20 matlabund dies ist die Ausgabe nice: kann die Nizza nicht einstellen: Erlaubnis verweigert. Matlab startet und der nette Wert ist 0.
Lord Loh.
@AlanShutko - Ich könnte system('sudo renice ...')in MATLAB laufen , aber matlab startet 2 Prozesse - MATLAB und matlab_helper. Ich könnte es auf beiden tun müssen. außerdem möchte ich, dass alle meine MATLAB-Prozesse eine hohe Priorität haben - wenn ich matlabpool local zur Parallelverarbeitung beginne . @HaukeLaging - Ich fange an zu denken, dass Sie Recht haben.
Lord Loh.

Antworten:

19

Ich würde es normal starten und danach "renice" verwenden ...

Allerdings konnte ich zusammen mit "su" einen schnellen Hack machen, der funktioniert:

sudo nice -n -20 su -c command_to_run user_to_run_as

(Wenn Sie sudo kein Passwort geben müssen - vielleicht weil Sie es bereits vergeben haben - können Sie ein "&" hinzufügen, um das Ganze in den Hintergrund zu stellen.)

Da Sie bereits mit dem Befehl sudo als root angemeldet sind, werden Sie von su nicht nach einem Passwort gefragt. Ich konnte ein X-Programm von einem Terminal-Emulator unter X starten. Wenn Sie das X-Programm als ein anderer Benutzer als der Benutzer ausführen möchten, der die X-Sitzung besitzt, müssen Sie X wahrscheinlich explizit anweisen, dies zuzulassen (Offen für X-Clients von diesem Benutzer).

Baard Kopperud
quelle
1
Vielen Dank. Ich denke, die Art und Weise, wie ich es mir vorgestellt habe, war die einzige Möglichkeit, etwas dagegen zu unternehmen.
Lord Loh.
Das funktioniert! Das Einzige, was mir jetzt begegnet, ist, dass ich keine Standardausgabe habe. Wie kann man das lösen? ZB sudo nice -n 19 su -c $(echo "test")gibt es keine Ausgabe.
Trommel
Mein Schlimmes, du musst sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do machen, siehe stackoverflow.com/a/3727572/2522849
DrumM
8

Einen Schritt weiter @Jordan, hier ist die elegante Lösung gegen sudo nice -n -xx su <username> -c matlabHack

Hinweis: Mit username = sid , matlab meta-data dir = / var / lib / matlab , nice = -10 können Sie nach Belieben ändern

  1. Matlab-Metadatenverzeichnis erstellen (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Fügen Sie einen bestimmten Benutzer hinzu, um matlab & right persimisson zu starten

    sudo useradd -d / var / lib / matlab sid
    sudo chown sid: sid / var / lib / matlab
  1. Legen Sie das Benutzer-Passwort (Sid-Passwort) fest

    sudo passwd sid

  2. Fügen Sie Folgendes an /etc/security/limits.conf an

    sid - priority -10

  3. Einrichten und Kopieren des SSH-Schlüssels zur Automatisierung der Anmeldung (OPTIONAL)

    ssh-keygen -t rsa #following key passwd misc   
    ssh-copy-id sid @ localhost # mit passwd von sid
  1. Matlab-Shell-Wrapper erstellen (Fehlerbehebung bei stillem Fehler )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Ein Wrapper zum Starten von matlab
    / usr / local / MATLAB / <version> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Ajust Sids Login-Shell

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

  2. starte matlab mit ssh mit Xforward

    ssh -X sid@localhost

Jiahao D.
quelle
2
Dies sollte die akzeptierte Antwort sein.
user47093
4

Ich habe festgestellt, dass dies durch Modifizieren der Datei /etc/security/limits.conf(zumindest in einigen Linux-Distributionen) möglich ist. In meinem Fall habe ich einfach hinzugefügt

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

dann kannst du ausführen

nice -n -20 matlab

Guyik
quelle
Nachdem Sie diese Änderung vorgenommen haben, sollten Sie sich abmelden
shaneb
2

Wie @jordanm sagte Drop Sudo. Sie können Ihre eigenen Prozesse optimieren, um ihnen eine niedrigere Priorität zuzuweisen:

nice -20 matlab

Nein sudo.

John
quelle
Das hat nicht funktioniert. system('ps a -o pid -o comm -o nice')hol mich 13580 MATLAB 19- MATLAB läuft mit der niedrigsten Priorität anstelle der höchsten. Meine Frage war, wie man die Priorität erhöht und nicht verringert.
Lord Loh.
Ohne a sudoist dies der richtige Befehl - nice -n -20 matlabund dies ist die Ausgabe nice: cannot set niceness: Permission denied. Matlab startet und der nette Wert ist 0.
Lord Loh.
3
OP will Priorität nicht erhöhen (negativ schön), dh. "nice --20 mathlab" (double -) in der alten Notation, "nice -n -20 mathlab" in der neuen. Nur root darf negative nice-Werte verwenden.
Baard Kopperud
1
CAP_SYS_NICE würde es dem OP auch ermöglichen, dies ohne Root-Rechte zu tun, beinhaltet jedoch das Erforschen der Linux-Fähigkeiten (etwas, das nicht viele Leute verstehen und das möglicherweise mehr Arbeit bedeutet, als es wert ist). Ich erwähne es nur der Vollständigkeit halber.
Bratchley
1

Mit pam können Sie die Konfigurationsdatei von nice pro Gruppe begrenzen:

@grnice harte Priorität -20

@grnice schwer nett -20

Und stellen Sie sicher, dass die Gruppe den Prozess in Grnice ausführt.

Jordan
quelle
1

Fügen Sie den Benutzer zu sudoers hinzu (tatsächlich eine neue Datei in /etc/sudoers.d, aber dieselbe Voraussetzung):

niceuser ALL=NOPASSWD:/usr/bin/nice

Dann als "niceuser":

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

und es tut, was ich brauche (das heißt, mein Benutzer kann jetzt die Priorität von {command ...} erhöhen). Es unterstützt mehrere Benutzer usw. - man 5 sudoersfür Details verwenden.

Abzieher
quelle
4
Dabei wird der Befehl immer noch als root ausgeführt, was das Poster zu vermeiden versucht.
Kyle Butt
1

Eine andere mögliche Option (einfach, aber weniger sicher) besteht darin, die Berechtigung setuid / setgid für die niceausführbare Datei zu aktivieren .

sudo chmod +s /usr/bin/nice

setuid weist jedem Benutzer, der die Datei ausführen kann, die effektive UID des Dateieigners zu (in diesem Fall root), wenn die Datei ausgeführt wird. Dies entspricht der Ausführung dieses Benutzers. setguid macht dasselbe für eine effektive GID.


Oder Sie können es sicherer machen:

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

Beachten Sie, dass Sie sich erneut anmelden müssen, damit die neue Gruppe wirksam wird.

Shou Ya
quelle