Wie kann ich einem Benutzer erlauben, einen Prozess nach negativer Qualität zu priorisieren?

12

Ich möchte, dass ein Benutzer einen bestimmten Prozess auf dem System mit einem negativen Wert ausführt. Ich kann den Prozess nicht einfach in den Hintergrund verschieben, da dieses spezielle Programm ein Minecraft-Server ist und ich mich auf die Befehlszeile verlasse, um den Server zu steuern.

Mein aktuelles Bash-Skript sieht folgendermaßen aus (der wichtige Teil):

sleep 10 && \
sudo renice -n $NICENESS $(ps -u $(id -u) -o "%p:%c" | sed -n "s/:java$//p") & \
java -Xmx8G -Xms2G -jar minecraft_server.jar nogui    

sleepverzögert einfach die Ausführung von renice. reniceselbst verwendet ps, um anhand der eigenen ID des Benutzers nach einem Java-Prozess zu suchen. Es kann andere Fälle von Java-Spawning unter verschiedenen Benutzern geben, aber der Minecraft-Server wird unter seinem eigenen Benutzer Minecraft ausgeführt .

Ich möchte natürlich nicht jedes Mal ein Passwort eingeben, wenn ich den Server starte.
von / etc / sudoers :

minecraft ALL = NOPASSWD: /etc/renice

Gibt es eine elegantere Möglichkeit, dies zu tun? In Kombination mit der Option NOPASSWD: ist die einfache Verwendung nicekeine Option. Dies wäre ein großes Sicherheitsproblem.sudo nice bash

Baarn
quelle

Antworten:

9

Das Modul pam_limits.so kann Ihnen dabei helfen.

Hier können Sie bestimmte Grenzwerte für bestimmte einzelne Benutzer und Gruppen oder Platzhalter oder Bereiche von Benutzern und Gruppen festlegen.

Die Grenzwerte, die Sie festlegen können, sind in der Regel Ulimit-Einstellungen, aber auch die Anzahl der gleichzeitigen Anmeldesitzungen, Prozesse, CPU-Zeit, Standardpriorität und maximale Priorität (Renice). Weitere Informationen finden Sie in der Manpage limits.conf.

Sie können beispielsweise Ihre Mindcraft-Gruppe so konfigurieren, dass alle Prozesse mit einer erhöhten Standardpriorität gestartet werden, und Sie können ihnen erlauben, die Befehle nice und renice zu verwenden, um die Priorität ihrer wichtigen Jobs auch manuell zu erhöhen, anstatt nur die Priorität zu verringern.

# /etc/security/limits.conf
# increase default and max prio for members of the mindcraft group
@mindcraft   hard priority -10
@mindcraft   hard nice     -18   
HBruijn
quelle
4
Nur das harte Limit für nicefestzulegen scheint nicht zu funktionieren, ich musste beide mit festlegen -.
Baarn
Scheint unter Ubuntu 16.04 überhaupt nicht zu funktionieren. Ich habe priorityauf -10 und nice-15 gesetzt und bekomme immer "Erlaubnis verweigert", selbst wenn ich versuche, "nice -n -2" für etwas zu verwenden. Muss ich neu starten? Ich habe mich gemäß diesem Rat einfach ab- und wieder angemeldet .
Richard Wiseman
Update zu meinem vorherigen Beitrag ... Seit dem Neustart habe ich festgestellt, dass die priorityEinstellung zwar wirksam ist, die niceEinstellung jedoch nur die Reduzierung der Priorität ermöglicht. Wenn ich etwas mit der Standardpriorität starte, ist es jetzt -10. Ich kann reniceden Prozess auf -9 bringen, aber dann nicht reniceauf -10.
Richard Wiseman
Update 2: Ich habe es geschafft! Die Verwendung hardverursachte die Probleme. Ich habe es -stattdessen geändert und jetzt funktioniert alles einwandfrei. Diese Antwort hat mir geholfen, dem auf den Grund zu gehen. Ich denke, das Problem war, dass ich ein weiches Limit hatte, das mir im Weg stand und vielleicht das harte Limit irgendwie überschrieb. Wie auch immer, -anstatt hardes für mich zu reparieren.
Richard Wiseman
1

Verwenden reniceohne sudowäre unmöglich. Ich zitiere aus der renice(1)Manpage:

Andere Benutzer als der Superuser können nur die Priorität ihrer eigenen Prozesse ändern und ihren "netten Wert" (aus Sicherheitsgründen) nur monoton im Bereich von 0 bis PRIO_MAX (20) erhöhen, es sei denn, es liegt ein nettes Ressourcenlimit vor set (Linux 2.6.12 und höher).

Joseph R.
quelle