rendere tutti i processi di un determinato utente accettabili da chiunque


15

Su un server condiviso, vorrei avere alcuni utenti con priorità molto bassa in modo tale che ogni qualvolta un altro utente (anche senza i privilegi di root) avesse bisogno delle risorse, potrebbe uccidere qualsiasi processo degli utenti con priorità bassa.

È possibile consentire qualcosa del genere?


1
Dare sudo -u uccisione dell'utente a tutti gli utenti eventualmente necessari in un gruppo
Kiwy,

4
Spero davvero che questi utenti a bassa priorità siano veri utenti umani e tu e i tuoi amici siete dei BOFH di razza pura . Rende la domanda molto più intrigante.
pipe

@DavidFoerster, un problema è che anche quando la CPU non è al 100% a bassa priorità il processo può riempire la cache del processore ecc. Allo stesso modo con l'accesso al disco ecc.
Ian Ringrose,

Risposte:


24

Concedi agli altri utenti l'autorizzazione a terminare i processi come utente a bassa priorità

sudo -u lowpriouser /bin/kill PID

Un utente può solo segnalare i propri processi, a meno che non dispongano dei privilegi di root. Utilizzando sudo -uun utente con l'impostazione corretta nel sudoersfile, è possibile assumere l'identità dell'utente a bassa priorità e terminare il processo.

Per esempio:

%killers ALL = (lowpriouser) /bin/kill

Ciò consentirebbe a tutti gli utenti del gruppo killersdi essere eseguiti /bin/killcome lowpriouser.

Vedi anche il sudoersmanuale del tuo sistema.


Su un sistema OpenBSD, lo stesso può essere fatto tramite l' doasutilità nativa con una configurazione simile

permit :killers as lowpriouser cmd /bin/kill

Poi

doas -u lowpriouser /bin/kill PID

Vedi i manuali di doase doas.conf.


Se si consente qualsiasi comando kill, è possibile abusarne per inviare segnali non correlati alla terminazione a processi arbitrari, il che può costituire un problema di sicurezza.
foresta,

@forest Questo è il motivo per cui non suggerisco di dare a tutti la possibilità di utilizzare l'account root per l'esecuzione kill. Nota anche che suggerisco di utilizzare un gruppo utenti ( killers), non tutti gli utenti.
Kusalananda

Ma quello che voglio dire è che consentirebbe a quel gruppo di inviare kill -HUP, non solo kill -TERM.
foresta,

@foresta Sì. Permette di inviare segnali a processi di proprietà di lowpriouser. Se vuoi limitare i segnali a TERM, quindi scrivi uno script shell wrapper /bin/kille consenti alle persone di usarlo invece di /bin/kill.
Kusalananda

1
%killers ALL = (lowpriouser) /bin/kill -(9, 15) [0-9 ]*
foresta,

5

Non dovresti uccidere i processi, se sono a bassa priorità consumeranno poche risorse.

Per renderli effettivamente a bassa priorità, modificare manualmente la loro priorità o utilizzare un demone come autonicequello che ho scritto per DEC OSF / 1 molti anni fa (c. 1994) che cerca lavori di lunga durata e riduce progressivamente la priorità più a lungo durano .

EDIT c'è un pacchetto chiamato andche offre questa funzionalità per i moderni Unices.


un problema è che anche quando la CPU non è al 100% a bassa priorità il processo può riempire la cache del processore ecc. Allo stesso modo con l'accesso al disco ecc.
Ian Ringrose,

@IanRingrose solo le attività pianificate per l'esecuzione possono occupare cache o eseguire accessi al disco.
Alnitak,

4

Penso che tu affronti il ​​problema da un'angolazione sbagliata: se un processo viene eseguito con impostazioni a bassa priorità (CPU, I / O) non dovrebbe influire molto su altri processi perché non sarà pianificato per l'esecuzione. Per quanto riguarda l'utilizzo della memoria, se la memoria principale è stretta e il processo non è stato pianificato per l'esecuzione a lungo (ad esempio a causa di vincoli CPU e I / O), le sue pagine "pulite" vengono eliminate e le pagine "sporche" vengono impegnate o sostituito e non influisce più sulle prestazioni di altri processi.

Conclusione: con la giusta impostazione di priorità e sufficiente spazio di scambio, non dovrebbe essere necessario uccidere lavori a bassa priorità per fare “spazio” per compiti più importanti; invece il kernel avrà cura di mettere il primo a dormire a favore del secondo.


1
"Bassa priorità" potrebbe anche significare "non importante" senza il significato implicito "in esecuzione con una priorità della CPU ridotta". Questo non è reso esplicito nella domanda però.
Kusalananda

@Kusalananda: sono d'accordo che questo non è esplicito nella domanda, ma la mia risposta afferma che dovrebbe essere nella realtà.
David Foerster,

1
Non è così semplice però. Anche un processo a bassa priorità può arrestare il sistema, specialmente se ha vincoli di memoria: a seconda di come sono impostati, lo scambio si trasformerà. Lo scambio provoca I / O (che potrebbe non essere incluso nella quota I / O del processo) e renderà il sistema meno reattivo per ordini di grandezza. Quindi probabilmente lo vorrai anche in generale (mentre altri non hanno bisogno delle risorse), il processo a bassa priorità può effettivamente ottenere tutte le risorse di cui ha bisogno (il che rende inapplicabili i limiti di memoria tipici). Le condivisioni della CPU aiutano qui.
Jonas Schäfer,

@JonasWielicki, il vecchio "modo unix" di scambiare il processo completo aveva il suo vantaggio. Se ricordo bene HPUX può alcuni strumenti per risolvere questo problema negli anni '90.
Ian Ringrose,
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.