Machen Sie alle Prozesse eines bestimmten Benutzers für jeden tötbar

15

Auf einem gemeinsam genutzten Server möchte ich einige Benutzer mit sehr niedriger Priorität haben, sodass sie, wenn ein anderer Benutzer (auch ohne Root-Berechtigungen) die Ressourcen benötigt, einen der Prozesse der Benutzer mit niedriger Priorität beenden können.

Kann man so etwas zulassen?

Aslan986
quelle
1
Geben Sie sudo -u user kill right für alle Benutzer, die möglicherweise in einer Gruppe benötigt werden
Kiwy
4
Ich hoffe wirklich, dass diese Benutzer mit niedriger Priorität echte menschliche Benutzer sind und dass Sie und Ihre Freunde reinrassige BOFHs sind . Das macht die Frage viel interessanter.
Pipe
@ DavidFoerster, ein Problem ist, dass, auch wenn die CPU nicht bei 100% niedriger Priorität Prozess ist, den Prozessor-Cache usw. füllen kann. Ebenso mit Festplattenzugriff usw.
Ian Ringrose

Antworten:

24

Erteilen Sie den anderen Benutzern die Berechtigung, die Prozesse als Benutzer mit niedriger Priorität zu beenden

sudo -u lowpriouser /bin/kill PID

Ein Benutzer kann nur seine eigenen Prozesse signalisieren, es sei denn, er verfügt über Root-Rechte. Durch die Verwendung sudo -ueines Benutzers mit der richtigen Einrichtung in der sudoersDatei kann die Identität des Benutzers mit niedriger Priorität angenommen und der Prozess abgebrochen werden.

Beispielsweise:

%killers ALL = (lowpriouser) /bin/kill

Dies würde es ermöglichen alle Benutzer in der Gruppe killerslaufen /bin/killwie lowpriouser.

Siehe auch das sudoersHandbuch auf Ihrem System.


Auf einem OpenBSD-System kann dasselbe über das native doasHilfsprogramm mit einer Konfiguration wie folgt gemacht werden

permit :killers as lowpriouser cmd /bin/kill

Dann

doas -u lowpriouser /bin/kill PID

Siehe die Handbücher für doasund doas.conf.

Kusalananda
quelle
Wenn Sie erlauben , jeden Befehl kill, können Sie es missbrauchen Signale in keinem Zusammenhang mit Kündigung auf beliebige Prozesse zu senden, die ein Sicherheitsrisiko sein kann.
Wald
@forest Aus diesem Grund schlage ich nicht vor, jedem die Möglichkeit zu geben, das Root-Konto zum Ausführen zu verwenden kill. Beachten Sie auch, dass ich die Verwendung einer Benutzergruppe ( killers) vorschlage , nicht aller Benutzer.
Kusalananda
Aber ich meine, das würde dieser Gruppe erlauben kill -HUP, nicht nur zu senden kill -TERM.
Wald
@forest Ja. Es ermöglicht das Senden von Signalen an Prozesse, deren Eigentümer lowpriouser. Wenn Sie die Signale auf einschränken möchten TERM, schreiben Sie ein Wrapper-Shell-Skript /bin/killund erlauben Sie den Benutzern, dieses anstelle von zu verwenden /bin/kill.
Kusalananda
1
%killers ALL = (lowpriouser) /bin/kill -(9, 15) [0-9 ]*
Wald
5

Sie sollten die Prozesse nicht beenden, da sie nur wenige Ressourcen verbrauchen, wenn sie eine niedrige Priorität haben.

Um sie tatsächlich auf niedrige Priorität zu setzen, ändern Sie ihre Priorität entweder manuell oder verwenden Sie einen Daemon, wie autoniceich ihn vor vielen Jahren für DEC OSF / 1 geschrieben habe (ca. 1994), der nach lang laufenden Jobs sucht und ihre Priorität schrittweise verringert, je länger sie ausgeführt werden .

EDIT gibt es ein Paket namens and, das diese Funktionalität für moderne Unices bietet.

Alnitak
quelle
Ein Problem ist, dass auch wenn die CPU nicht bei 100% niedriger Priorität ist, der Prozess den Prozessor-Cache usw. füllen kann. Ebenso bei Festplattenzugriff usw.
Ian Ringrose
@IanRingrose Nur Aufgaben, deren Ausführung geplant wurde, können den Cache belegen oder Datenträgerzugriffe ausführen.
Alnitak
4

Ich denke, Sie nähern sich dem Problem aus einem falschen Blickwinkel: Wenn ein Prozess mit Einstellungen niedriger Priorität (CPU, E / A) ausgeführt wird, sollte dies keine großen Auswirkungen auf andere Prozesse haben, da die Ausführung nicht geplant ist. Wenn der Hauptspeicher knapp ist und der Prozess nicht lange ausgeführt werden sollte (z. B. aufgrund von CPU- und E / A-Einschränkungen), werden die "sauberen" Seiten gelöscht und die "schmutzigen" Seiten festgeschrieben oder ausgelagert werden und die Leistung anderer Prozesse nicht mehr beeinträchtigen.

Fazit: Mit der richtigen Prioritäteneinstellung und ausreichend Swap-Platz sollte es unnötig sein, Jobs mit niedriger Priorität abzubrechen, um Platz für wichtigere Aufgaben zu schaffen. Stattdessen wird der Kernel dafür sorgen, dass der erstere zugunsten des letzteren eingeschlafen wird.

David Foerster
quelle
1
"Niedrige Priorität" könnte genauso gut "nicht wichtig" bedeuten, ohne die implizite Bedeutung "mit verringerter CPU-Priorität". Dies wird in der Frage jedoch nicht explizit erwähnt.
Kusalananda
@Kusalananda: Ich stimme zu, dass dies in der Frage nicht explizit ist, aber meine Antwort besagt, dass es in der Realität sein sollte.
David Foerster
1
Es ist jedoch nicht so einfach. Sogar ein Prozess mit niedriger Priorität kann das System zum Stillstand bringen, insbesondere wenn es Speicherbeschränkungen gibt: Je nachdem, wie diese eingerichtet sind, wird der Prozess ausgetauscht. Das Austauschen verursacht E / A (die möglicherweise nicht in der E / A-Quote des Prozesses enthalten sind), und das System reagiert um Größenordnungen weniger schnell. Dann möchten Sie wahrscheinlich auch, dass im Allgemeinen (während andere die Ressourcen nicht benötigen) der Prozess mit niedriger Priorität tatsächlich alle benötigten Ressourcen abrufen kann (wodurch typische Speicherbeschränkungen nicht zutreffen). Hier helfen CPU-Freigaben.
Jonas Schäfer
@JonasWielicki, der alte "Unix-Weg", einen kompletten Prozess auszutauschen, hatte seinen Vorteil. Wenn ich mich richtig erinnere, kann HPUX einige Tools zur Lösung dieses Problems in den 1990er Jahren einsetzen.
Ian Ringrose